7

在 Haskell 中,我们有函数

map (a -> b) -> [a] -> [b]

使用函数更改集合的类型。

C#中有类似的东西吗?

或者,例如,将完整的 KeyValuePairs 集合放入调试消息中的最快方法是什么?

我想到了

debugmsg("http response is " + service.HttpResponseHeaders
                                      .Map<string>((k, v) => k + "->" + v)
                                      .Aggregate((s, sx) => s + "," + sx)
                             + ". ");
4

5 回答 5

12

在 LINQ 中,map被命名为Select. 另外,请注意任何集合在;KeyValuePair<TKey, TValue>中只有一个参数。Select你必须把它拉Key出来Value

service.HttpResponseHeaders.Select(kvp => kvp.Key + "->" + kvp.Value)
                           .Aggregate((s, sx) => s + "," + sx);
于 2013-11-06T07:46:41.577 回答
1

您可以使用Dictionary,它基本上是KeyValuePairs 的集合并执行以下操作:

service.HttpResponseHeaders
                  .Select(kvp => kvp.Key + " -> " + String.Join(" - ", kvp.Value))
                  .Aggregate((s, sx) => s + ", " + sx);

优化聚合:优化字符串连接的聚合

于 2013-11-06T07:52:21.473 回答
1

正如其他人所指出的,您可以使用 Select 将一种类型映射到另一种类型。但是,最好使用String.Join创建最终字符串,以避免创建无用的临时字符串。

.NET 中的字符串是不可变的,因此添加两个字符串会创建一个新字符串。另一方面,String.Join 在内部使用 StringBuilder 将数据添加到可变缓冲区并返回最终结果。

您应该注意,虽然HttpResponseHeaders包含每个键的多个值。仅将值转换为字符串是行不通的。

下面将从响应标头中创建一个以逗号分隔的值列表。如果标头有多个值,则用“|”分隔:

var headerStrings=from header in service.HttpResponseHeaders
            let headerValue=String.Join("|",header.Value)
            select String.Format("{0} -> {1}",header.Key,headerValue);
var message=String.Join(",",headerStrings);
于 2013-11-06T08:06:35.790 回答
0

您可以使用.Select(),或者如果它是您可以使用的列表.ConvertAll()

这是 MSDN 文档

可枚举.Select

List.ConvertAll

于 2013-11-06T07:46:28.617 回答
0

LINQ 自带Select

签名(Haskell 风格):

IEnumerable<TSource>.Select(Func<TSource->TResult>)->IEnumerable<TResult>
于 2013-11-06T07:47:17.500 回答