在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)
+ ". ");
答案 0 :(得分:7)
在LINQ中,map
被命名为Select
。另请注意,KeyValuePair<TKey, TValue>
的任何集合在Select
中只有一个参数;你必须将Key
和Value
拉出来。
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);
答案 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)
答案 4 :(得分:0)
LINQ附带Select
签名(Haskell风格):
IEnumerable<TSource>.Select(Func<TSource->TResult>)->IEnumerable<TResult>