防止Dictionary在用作IEnumerable.Zip扩展参数时被转换为KeyValuePair

问题描述 投票:0回答:1

用这个简短的可重现示例替换我的第一个无效问题

var firstObjects = new List<object>();
var secondObjects = new List<object>();
Dictionary<object, object> inner = secondObjects.Select(o => o).Zip(secondObjects).ToDictionary();
var outer = firstObjects.Select(o => o).Zip(inner).ToDictionary();

问题是为什么是

outer
的结果:

Dictionary<object, KeyValuePair<object, object>>

而不是:

Dictionary<object, Dictionary<object, object>>

c# dictionary
1个回答
0
投票

问题是为什么外部的结果是:

Dictionary<object, KeyValuePair<object, object>>
而不是:
Dictionary<object, Dictionary<object, object>>

基本上是一样的,为什么内部的结果是

Dictionary<object, object>

Enumerable.Zip<TFirst,TSecond>(IEnumerable<TFirst>, IEnumerable<TSecond>)
,如文档所述:

使用两个指定序列中的元素生成元组序列。

退货

IEnumerable<ValueTuple<TFirst, TSecond>>
元组序列,其中元素按顺序取自第一个和第二个序列。

并且

Dictionary<TKey, TValue>
IEnumerable<KeyValuePair<TKey,TValue>>
(docs),所以结果是非常符合预期的。

如果您希望

Zip
的结果为
IEnumerable<object, Dictionary<...>>
,您需要使用字典集合进行压缩,即类似:

IEnumerable<Dictionary<object, object>> dicts = ...;
var outer = firstObjects.Select(o => o)
   .Zip(dicts)
   .ToDictionary();

请注意,您可能想要

Select
,而不是
Zip
,但没有实际的代码/示例数据和所需的结果,很难说。

© www.soinside.com 2019 - 2024. All rights reserved.