Visual C#Collection“map”功能?

时间:2013-11-06 07:42:13

标签: c# visual-studio collections map

在Haskell中我们有函数

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

使用函数更改Collection的类型。

C#中有类似内容吗?

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

我想到了......好像

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

5 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:1)

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

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

优化聚合:Optimizing Aggregate for String Concatenation

答案 2 :(得分: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);

答案 3 :(得分:0)

您可以使用.Select(),如果是列表,则可以使用.ConvertAll()

以下是MSDN文档

Enumerable.Select

List.ConvertAll

答案 4 :(得分:0)

LINQ附带Select

签名(Haskell风格):

IEnumerable<TSource>.Select(Func<TSource->TResult>)->IEnumerable<TResult>