如何在字典中找到“第一个”值?

Asked
Viewd20191

5

如何在MyTableClass继承Dictionary<int, MyTableClass>Field<F1, F2, F3>中找到第一个值?我更希望使用“属性”或“属性/方法”组合来返回“字典”中第一个值F1 = MyEnum.value

我不想做的是foreach。从性能角度来看,这实际上不是首选方法。

  • @Pavel:哇…近两年来我学到了很多东西。我希望我知道然后我现在知道。

    IAbstractAugust 17, 2011 23:14
  • 就性能而言,您可以在此处执行的任何操作(如LINQ等)都不会快于foreach,因为您没有在字典键上进行查找。仅密钥查找是快速的。对于其他任何事情,您都必须进行线性扫描(或为其他键维护第二个字典,这将与您进行查找一样)。

    Pavel MinaevNovember 13, 2009 20:33

4 个答案

6

无论您在这里如何修饰,您基本上都必须对foreach中的值执行DictionaryDictionary<TKey,TValue>为给定值的完整密钥提供接近O(1)的访问权限。它并非旨在提供对部分密钥的有效访问。为了实现这一点,您需要保留第二个Dictionary实例以进行适当的映射。

5

字典在元素之间不维护任何特定顺序,因此除非您指定某些顺序,否则实际上没有任何元素可以成为第一个元素。

您可以获得字典恰巧找到的第一个项目:

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

这将循环遍历各个项目,直到找到匹配项,因此您仅将字典用作列表。如果您需要任何演奏,则应该有一个字典,其中F1的值是键。

  • 感谢大家的回答。我非常放心,foreach是完成我想要的事情的唯一方法-但是只是想看看是否有人有我没想到的想法...:)

    IAbstractNovember 17, 2009 16:51
7

查找与某些条件匹配的值的最短方法(我不太了解您想要的具体内容-首先F1是泛型类型参数,然后使用==对其进行比较,就好像它是一个值...)就是这样做的:

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

其中...将是x上的布尔表达式。但是,这不会比foreach 快。...因为您没有在字典键上进行查找。仅密钥查找是快速的。对于其他任何事情,您都必须进行线性扫描(或为其他键维护第二个字典,这将是您要查找的内容)。 [从评论复制] >

2

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

  • 如果您可以在答案中添加更多上下文,将会有所帮助

    Edwin Ikechukwu OkonkwoSeptember 29, 2016 08:42
  • .First()在什么地方?在Dictionary obj上没有这样的方法。

    Edwin Ikechukwu OkonkwoSeptember 29, 2016 08:42
  • 这是一种扩展方法,因此只有在导入System.Linq时才能看到它

    maxpower47September 29, 2016 15:41