【问题标题】:Convert dictionary to List<KeyValuePair>将字典转换为 List<KeyValuePair>
【发布时间】:2011-06-01 05:30:30
【问题描述】:

我知道可以将 KeyValuePair 列表转换为字典,但是有没有一种快速的方法(除了手动循环)来执行反之亦然的操作?

这将是手动方式,

foreach (KeyValuePair<double,double> p in dict)
{
    list.Add(new KeyValuePair<double,double>(p.Key,p.Value));
}

没那么糟糕,但我只是好奇。

【问题讨论】:

  • 你不需要创建新的KeyValuePairs;这要简单得多:foreach (KeyValuePair&lt;double, double&gt; p in dict) { list.Add(p); }

标签: c# generics collections


【解决方案1】:

要将Dictionary&lt;TKey, TValue&gt; 转换为List&lt;KeyValuePair&lt;TKey, TValue&gt;&gt;,您只需说

var list = dictionary.ToList();

或者更详细的

var list = dictionary.ToList<KeyValuePair<TKey, TValue>>();

这是因为Dictionary&lt;TKey, TValue&gt; 实现了IEnumerable&lt;KeyValuePair&lt;TKey, TValue&gt;&gt;

【讨论】:

  • 值得注意的是,您必须将System.Linq; 添加为使用。
【解决方案2】:

使用 linq:

myDict.ToList<KeyValuePair<double, double>>();

字典元素 KeyValuePair items.

【讨论】:

    【解决方案3】:

    就像杰森说的那样。但是,如果您真的不需要列表,则可以将其转换为ICollection&lt;TKey, TValue&gt;;因为它实现了这个接口,但有些部分只是显式的。此方法性能更好,因为它不会复制整个列表,只是重复使用相同的字典实例。

    【讨论】:

    • 铸造速度无限快。如果你只用小列表做几次,这并不明显,但它仍然很重要。
    • @Jason:不正确。对扩展方法 Enumerable.ToList> 的调用可能很昂贵。从另一个角度看,它必须返回一个新的列表,否则你可以通过向列表中添加项目来向字典中添加项目,这会很奇怪。
    • 为什么人们总是把这些东西称为不必要的微优化?你怎么知道他不会用包含一百万个元素的列表运行它一千次?以最好的方式学习和做事不是总是更好吗?如果他学习软件编程而不给这些东西打*,那会更好吗?好吧,这不是我的问题,这样我就知道我总会有一份工作。
    • @fejesjoco:因为人们受制于周期和字节,就像 1980 年一样。一般来说,首先过于强调性能,而不是代码的清晰度和其他问题。性能不再是全部(例如,对于移动设备,我们应该优化功耗,而不是性能!)我不知道他不会在包含一百万个列表的情况下运行它一千次元素,但我怀疑他不会。如果他是,我仍然怀疑这是否重要。即使这很重要,他也有更大的问题要担心,因为他做错了什么。
    • 你们在谈论这种优化,就像它不可读或功能不那么强大之类的,这太荒谬了。如果您所需要的只是一个集合,那么这很有效并且是首选方法,您不会牺牲任何可读性并且它会无限快(在少数可能很重要的边缘情况下)。这不是不必要的微优化,它只是一种好的做法。 OTOH,如果您需要列表,请点击并调用 .ToList(); -- 无论哪种方式,您的代码都易于阅读,并且可能在不牺牲可读性的情况下尽可能快。
    【解决方案4】:

    对于 .NET 2.0:

    Dictionary<TKey, TValue> dictionary = new Dictionary<TKey, TValue>();
    List<KeyValuePair<TKey, TValue>> myList = new List<KeyValuePair<TKey, TValue>>(dictionary);
    

    【讨论】:

      【解决方案5】:

      我一直在尝试枚举一个 IDictionary 的 Exception.Data 实例。这就是最终奏效的方法:

          ICollection keys = idict.Keys;
          foreach(var key in keys)
          {
             var value = idict[key];
             Console.WriteLine("{0}: {1}", key, value);
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-23
        • 1970-01-01
        • 2013-01-07
        • 1970-01-01
        • 1970-01-01
        • 2021-06-05
        • 2012-12-28
        • 1970-01-01
        相关资源
        最近更新 更多