C# Visual C集合“映射”功能?
在Haskell中,我们有这个函数C# Visual C集合“映射”功能?,c#,visual-studio,collections,map,C#,Visual Studio,Collections,Map,在Haskell中,我们有这个函数 map (a -> b) -> [a] -> [b] 使用函数更改集合的类型 C语言中有类似的东西吗 或者,例如,将完整的KeyValuePairs集合放入调试消息的最快方法是什么 我想到了类似的事情 debugmsg("http response is " + service.HttpResponseHeaders .Map<string>((k, v
map (a -> b) -> [a] -> [b]
使用函数更改集合的类型
C语言中有类似的东西吗
或者,例如,将完整的KeyValuePairs集合放入调试消息的最快方法是什么
我想到了类似的事情
debugmsg("http response is " + service.HttpResponseHeaders
.Map<string>((k, v) => k + "->" + v)
.Aggregate((s, sx) => s + "," + sx)
+ ". ");
您可以使用.Select,或者如果它是您可以使用的列表,则可以使用.ConvertAll
这是MSDN文档
在LINQ中,映射名为Select。另外,请注意,任何KeyValuePair集合在Select中只有一个参数;您必须从中提取关键点和值
service.HttpResponseHeaders.Select(kvp => kvp.Key + "->" + kvp.Value)
.Aggregate((s, sx) => s + "," + sx);
LINQ附带Select
签名哈斯克尔风格:
IEnumerable<TSource>.Select(Func<TSource->TResult>)->IEnumerable<TResult>
您可以使用Dictionary,它基本上是KeyValuePairs的集合,并执行以下操作:
service.HttpResponseHeaders
.Select(kvp => kvp.Key + " -> " + String.Join(" - ", kvp.Value))
.Aggregate((s, sx) => s + ", " + sx);
优化聚合:正如其他人所指出的,您可以使用Select将一种类型映射到另一种类型。创建最终字符串最好使用,以避免创建无用的临时字符串 NET中的字符串是不可变的,因此添加两个字符串将创建一个新字符串。另一方面,Join在内部使用StringBuilder将数据添加到可变缓冲区并返回最终结果 但您应该注意,它包含每个键的多个值。仅将值转换为字符串是行不通的 下面将从响应标题创建一个逗号分隔的值列表。如果标题有多个值,则它们之间用“|”分隔:
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);
值是一个IEnumerable。如果键值对中的值是一个集合,那么对该值执行SelectMany a.k.a flatMap应该可以解决这个问题。实际上,您不需要将一个标题名与多个值组合在一起。单次操作是不够的。执行kvp=>kvp.Key+->+string.Join-,kvp.Value应该足够好。问题是关于map的…HttpResponseHeaders也是KeyValuePair的集合,实际上它实现了IEnumerable。不需要字典,字符串连接将返回字符串[],而不是标头值,然后根据您的值调用.Aggregate。看看我的edit.a String.Join会更简单更快,因为它不会创建任何临时字符串。你确定吗?Aggregate会吗?为什么它不应该也使用StringBuilder呢?除了DRY之外,试一下看看它看起来有多难看——一个头可以有多个值。简单地连接该值是行不通的