从IEnumerable <KeyValuePair <>>重新创建字典


172

我有一个返回的方法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");

Answers:


327

如果您使用的是.NET 3.5或.NET 4,则使用LINQ创建字典很容易:

Dictionary<string, ArrayList> result = target.GetComponents()
                                      .ToDictionary(x => x.Key, x => x.Value);

没有a之类的东西,IEnumerable<T1, T2>但是a KeyValuePair<TKey, TValue>很好。


14
考虑到Dictionary <TKey,TValue>实现IEnumerable <KeyValuePair <TKey,TValue >>,您可能会认为不需要参数的调用,但是很好。轻松制作自己的。
Casey 2014年

1
@emodendroket为什么会这样呢?您可以将接口直接将Dictionary强制转换为提到的IEnumerable,但反之则不能。即IEnumerable<KeyValuePair<TKey, TValue>>不实现或继承Dictionary<TKey, TValue>
2014年

6
@DanVerdolino我知道。您可能会认为,因为这就像您可能想对IEnumerable KVP执行的最常见的操作之一。
Casey

17
现在是2016年,我仍然必须用谷歌搜索它。你会认为会有一个构造Dictionary是花了IEnumerable<KeyValuePair<TKey, TValue>>,就像List<T>需要IEnumerable<T>。也没有AddRange甚至没有Add键/值对。那是怎么回事?
死于maus 2013年

5
现在是2017年,我们可以将其添加为扩展方法!
克里斯·布什

2

来源(MS docs)

知道已经解决了这个问题,但是首先看到这篇文章,然后在文档中找到解决方案后,我认为这可能会帮助另一个未来的人

从dot net core 2.0开始,构造函数Dictionary<TKey,TValue>(IEnumerable<KeyValuePair<TKey,TValue>>)现在存在。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.