2009-11-13 98 views
5

如何才能找到第一个值在Dictionary<int, MyTableClass>其中MyTableClass继承Field<F1, F2, F3>?我更喜欢属性或属性/方法组合,它返回字典中的第一个值F1 = MyEnum.value。我不想做的是foreach。在性能方面,这实在不是一个首选的方法。如何在字典中查找'第一个'值?

+4

性能方面,你可以在这里做的任何事情 - LINQ等 - 不会比'foreach'快,因为你没有对字典键进行查找。只有密钥查找速度快;对于其他任何事情,你必须做一个线性扫描(或为另一个键维护第二个字典,这将是你做任何查找)。 – 2009-11-13 20:33:55

+0

@Pavel:哇...我在近2年中学到了很多东西。我希望我知道我现在知道的。 – IAbstract 2011-08-17 23:14:15

回答

6

无论你如何在这里打扮,你基本上必须做一个foreach超过Dictionary的值。 A Dictionary<TKey,TValue>提供了接近于O(1)访问全键到给定值。它的目的不是为了提供对部分密钥的有效访问。为了得到您需要保留第二个Dictionary实例进行适当的映射。

2

您可以使用.First()扩展方法。

+0

。第一次()什么? Dictionary obj上没有这样的方法。 – 2016-09-29 08:42:26

+0

将帮助,如果您可以添加更多的上下文到您的答案 – 2016-09-29 08:42:55

+0

这是一种扩展方法,所以你只有当你导入System.Linq – maxpower47 2016-09-29 15:41:46

6

查找符合某些条件的值的最短途径(我无法完全理解您想要的具体内容 - 首先F1是一个泛型类型参数,然后使用==将其作为一个值进行比较.. )是做到这一点:

dictionary.Values.First(x => ...); 

其中...将在x一个布尔表达式。但是,这不会比foreach...更快,因为您没有对字典键进行查找。只有密钥查找速度快;对于其他任何事情,你必须做一个线性扫描(或为另一个键维护第二个字典,这将是你做任何查找)。

5

字典没有在元素之间保持任何特定的顺序,所以没有任何元素可以作为第一个元素,除非你指定了一些顺序。

你可以得到字典碰巧找到这样的第一个项目:

MyTableClass one = dict.Where(pair => pair.Value.F1 == MyEnum.value).First(); 

这只会通过项目循环,直到它找到一个匹配,所以你只是用字典为列表。如果你想要任何表演,你应该有一本字典,其中F1的值是关键。

+0

谢谢大家的答案。我非常确定,foreach将是唯一能够做我想做的事情的方法 - 但只是想看看有没有人想过我的想法...... :) – IAbstract 2009-11-17 16:51:46

相关问题