2012-01-14 34 views
3

首先,看一下這個代碼:使用LINQ獲取第一個排序元素? (C#)

Dictionary<int,int> dict = Dictionary<int,int>(); 
dict[3] = 1; 
dict[2] = 2; 
dict[1] = 3; 

foreach(KeyValuePair<int,int> item in dict.OrderByDescending(p => p.Value)) 
{ 
    print(item.Value); 
    break; 
} 

這段代碼,基本上將打印的最高值在字典中項的值。我想在不使用「破碎的」foreach循環的情況下完成此操作。我該怎麼做?

回答

9

嗯,你可以這樣做:

if(dict.Any()) 
    print(dict.Values.Max()); 

這不僅更加簡潔,而且也並不需要外的地方,首先分揀字典(這是在OrderByDescending開始枚舉一樣) ,所以在時間和空間上都更加高效。

如果你需要鑰匙,以及,你可以使用一個MaxBy運營商(如moreLinq)如下:

if(dict.Any()) 
{ 
    var bestKvp = dict.MaxBy(kvp => kvp.Value); 
    Console.WriteLine("Key = {0}, Value = {1}", bestKvp.Key, bestKvp.Value); 
} 

有可能在O(n)時間和O(1)標準LINQ實現這一目標到對象與Aggregate操作空間,但它是相當難看:

if(dict.Any()) 
{ 
    var bestKvp = dict.Aggregate((bestSoFar, next) => bestSoFar.Value > next.Value ? bestSoFar : next); 
    Console.WriteLine("Key = {0}, Value = {1}", bestKvp.Key, bestKvp.Value); 
} 
+0

好吧!這似乎比使用LINQ更簡單,謝謝!但有一點是,我需要獲得關鍵。那可能嗎? – 2012-01-14 06:32:09

+3

其實,你正在看的許多*是* linq。或者,更準確地說,IEnumerable接口的擴展方法是 2012-01-14 06:39:16

1

我,在大多數情況下,內容與阿尼的答案。但是,我想指出First<T>()Last<T>() LINQ函數。

var value = dict.OrderByAscending(pair => pair.Value).First(); 

對不起,我不能只是評論,我是新成員。不過,你應該使用阿尼的回答,因爲他是正確的,他的走得更快。

相關問題