2012-07-18 38 views
4

我有一个SortedDictionary如何找到与最大值关联的密钥?我是否必须遍历每个KeyValuePair?从SortedDictionary中查找带有最大值的键?

+0

你能澄清一下:你想要最大的密钥吗? 'SortedDictionary'按键的大小排序。所以这将是某种方式中的“最后”键。如果没有快速的方法来获得它,这很有趣!或者你实际上指的是最大值?这是你必须迭代整个集合(可能使用Linq的'Max'方法。 – 2012-07-18 20:30:42

+3

请注意,这个值不一定是唯一的。你需要所有的密钥持有MaxValue还是任何人都可以? – 2012-07-18 20:33:03

+0

@JeppeStigNielsen I不想要最大的密钥,我想要最大的密钥。 – User 2012-07-18 20:33:05

回答

4

如果dict是你SortedDictionary<,>,你想所有对应于最大值的钥匙,首先检查dict不为空或空(你至少需要一个元素)。那么也许这个作品:

var max = dict.Values.Max(); 
var relevantKeys = dict.Where(pair => max.Equals(pair.Value)) 
    .Select(pair => pair.Key); 

也许它可以做得更有效率?

+0

我会写pair.Value.Equals(max),但是,它看起来很优雅。我只是喜欢流利的代码;) – 2012-07-18 20:54:57

+0

@MareInfinitus我认为:更有可能是某些值为'null',而不是'max'为'null'(尽管可能发生,我猜如果_all_值是' null')。 – 2012-07-18 20:59:27

+0

也许我应该说'Equals(pair.Value,max)',即静态的'Equals'。 – 2012-07-18 21:02:05

2

使用Enumerable.OrderByDescending(),然后访问什么样的Key财产,像这样First()回报:

var dict = new SortedDictionary<string, string> 
         { 
          {"key1", "value3"}, 
          {"key2", "value1"}, 
          {"key3", "value2"}, 
         }; 

     var max = dict.OrderByDescending(d => d.Value).First(); 
     var key = max.Key; 
+0

因此Max()返回一个KeyValuePair而不仅仅是最大值? – User 2012-07-18 20:27:27

+0

对不起,Max()在这里使用不正确 – Sumo 2012-07-18 20:31:56

+0

对downvote没有评论? – Sumo 2012-07-19 13:28:56

0

掌握最高值相关联的密钥,你实际上并没有使用SortedDictionary的默认排序指。这是因为SortedDictionar通过Key来订购,而不是Value。所以,做你想做什么,你会做的老式LINQ方式:

sortedDict.OrderByDescending(kvp => kvp.Value).First().Key 
1

可以使用MaxBy方法MoreLinq高效地运行此查询。

var result = dictionary.MaxBy(pair => pair.Value).Key; 

这将只需要一次迭代中的数据,而不是分选的值并取第一结果(这将是O(n * log(n)))。

由于只有键而不是值被排序,所以没有至少循环每个密钥对一次就无法执行该查询。

另一种选择是拥有两个SortedDictionaries。一个将是你已经拥有的那个,另一个将是一个反向字典。对于当前字典中的每个值,您可以将其添加为第二个字典的关键字,并且第二个字典的值将成为第一个字典的关键字(如果它是一对多关系而不是一对一的值反向查找将需要一个项目列表)。虽然它会以编程方式“昂贵”(更多的是在内存中而不是时间,但仍然有一部分)来创建第二个字典,一旦你这样做,你将能够基于值而不是按键进行有效查询。

+0

你也可以自己实现MaxBy。这只是几行代码:http://stackoverflow.com/a/8759648/385844 – phoog 2012-07-18 20:55:18

+0

@phoog我假设OP将能够复制/粘贴[链接的]代码只是maxBy并使用它,而不是整个项目(除非他对此感兴趣)。的确,这并不是那么多的代码。实际上,整个Linq对象并不是那么多的代码,考虑到它所做的一切以及它的使用频率。谢谢你的迭代块。 – Servy 2012-07-18 20:57:28

0

要获得所有您最感兴趣的值的密钥,必须完成一些数据处理。其实这在C#中很舒服。

它可以通过做LINQ的

​​

的某种组合来实现有乐趣!

+0

+1,注意可能有多个关键字与最大值关联。 – phoog 2012-07-18 20:56:37