Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Visual C集合“映射”功能?_C#_Visual Studio_Collections_Map - Fatal编程技术网

C# Visual C集合“映射”功能?

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

在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)
                             + ". ");
您可以使用.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之外,试一下看看它看起来有多难看——一个头可以有多个值。简单地连接该值是行不通的