将字典转换为List<KeyValuePair>

64
我知道可以将一个KeyValuePair的List转换为Dictionary,但除了手动循环遍历之外是否有快速的方法来执行相反的操作呢?
这是手动实现的方式:
foreach (KeyValuePair<double,double> p in dict)
{
    list.Add(new KeyValuePair<double,double>(p.Key,p.Value));
}

其实并不算太糟糕,但我只是好奇。


3
不需要创建新的键值对;这种方法更简单:foreach (KeyValuePair<double, double> p in dict) { list.Add(p); } - phoog
5个回答

143

要将 Dictionary<TKey, TValue> 转换为 List<KeyValuePair<TKey, TValue>>,你只需要这样说:

var list = dictionary.ToList();
或者更冗长的表述
var list = dictionary.ToList<KeyValuePair<TKey, TValue>>();

这是因为Dictionary<TKey, TValue>实现了IEnumerable<KeyValuePair<TKey, TValue>>接口。


19
值得注意的是,您需要添加System.Linq;作为using。 - Harry

8

使用linq:

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

字典元素是 KeyValuePair 项。


8

就像Jason所说的那样。但是如果你不需要一个列表,那么你可以将它转换为ICollection<TKey, TValue>;因为它实现了这个接口,但某些部分只是显式地实现。这种方法的性能更好,因为它不会复制整个列表,只是重用相同的字典实例。


2
强制转换速度非常快。如果您只对小列表进行少量操作,则可能不会注意到,但它确实非常重要。 - fejesjoco
1
@Jason:不是这样的。调用扩展方法Enumerable.ToList<KeyValuePair<TKey, TValue>>可能会很昂贵。从另一个角度来看,它必须返回一个新列表,否则你可以通过向列表添加项来向字典添加项,这将很奇怪。 - JBSnorro
3
为什么人们一直称这些为不必要的微优化?你怎么知道他不会运行包含一百万元素的列表一千次?总是以最好的方式学习和做事不是更好吗?如果他学习软件编程而不关心这些事情,那会更好吗?嗯,这不是我的问题,我知道这样我就永远有工作了。 - fejesjoco
5
@fejesjoco说:“因为人们仍像1980年一样被循环和字节所奴役。通常过于强调代码性能,而忽略了代码清晰度和其他问题。如今性能并不是最重要的(例如在移动设备上,我们应该优化电源消耗而非性能!)我不知道他是否会使用包含百万元素的列表运行它一千次,但我怀疑他不会这样做。即使他这样做了,我还是认为这并不重要。即使确实很重要,他也应该担心更大的问题,因为他做错了些什么。” - jason
3
你们在谈论这种优化时好像它很难读懂或者不够强大之类的,这是荒谬的。如果你只需要一个集合,这种方法非常好用并且是首选方法,你不会牺牲任何可读性,而且速度会更快(在极少数可能需要考虑速度的情况下)。这不是不必要的微小优化,而是一种好的实践。另一方面,如果你需要一个列表,请接受这种方式并调用.ToList();无论如何,你的代码易于阅读,并且可能在不牺牲可读性的情况下达到了最快的速度。 - BrainSlugs83
显示剩余11条评论

0

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

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

0

对于 .NET 2.0:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接