从 IEnumerable<KeyValuePair<>> 重新创建字典
Posted
技术标签:
【中文标题】从 IEnumerable<KeyValuePair<>> 重新创建字典【英文标题】:Recreating a Dictionary from an IEnumerable<KeyValuePair<>> 【发布时间】:2011-02-07 20:38:03 【问题描述】:我有一个返回IEnumerable<KeyValuePair<string, ArrayList>>
的方法,但是一些调用者要求该方法的结果是一个字典。如何将IEnumerable<KeyValuePair<string, ArrayList>>
转换为Dictionary<string, ArrayList>
以便我可以使用TryGetValue
?
方法:
public IEnumerable<KeyValuePair<string, ArrayList>> GetComponents()
// ...
yield return new KeyValuePair<string, ArrayList>(t.Name, controlInformation);
来电者:
Dictionary<string, ArrayList> actual = target.GetComponents();
actual.ContainsKey("something");
【问题讨论】:
可能重复? ***.com/questions/7850334/… 【参考方案1】:从 .NET Core 2.0 开始,构造函数 Dictionary<TKey,TValue>(IEnumerable<KeyValuePair<TKey,TValue>>)
现在存在。
【讨论】:
【参考方案2】:如果您使用的是 .NET 3.5 或 .NET 4,使用 LINQ 创建字典很容易:
Dictionary<string, ArrayList> result = target.GetComponents()
.ToDictionary(x => x.Key, x => x.Value);
没有IEnumerable<T1, T2>
这样的东西,但KeyValuePair<TKey, TValue>
很好。
【讨论】:
你会认为会有一个不需要参数的调用,因为 DictionaryDictionary
的构造函数会使用IEnumerable<KeyValuePair<TKey, TValue>>
,就像List<T>
使用IEnumerable<T>
一样。也没有采用键/值对的AddRange
甚至Add
。那是怎么回事?
现在是 2017 年,我们可以将其添加为扩展方法!
很多“我不敢相信.net core没有”通过MoreLinq解决。包括一个无参数的 IEnumerableToDictionary()
以上是关于从 IEnumerable<KeyValuePair<>> 重新创建字典的主要内容,如果未能解决你的问题,请参考以下文章
EF4 complex Select():从业务层返回 IEnumerable 或 IEnumerable<MyCustomDto>?
从 IEnumerable<KeyValuePair<>> 重新创建字典
如何从客户端接收 IEnumerable<int>? [复制]
无法从“System.Collections.IList”转换为“System.Collections.Generic.IEnumerable<T>”