2014-05-19 15 views
9

prawdopodobnie dla Ciebie dzisiaj, ale obecnie jestem w kółko. Rozważmy ten scenariusz:Słownik C# uzyskać klucz minimalnej wartości

var tempDictionary = new Dictionary<string, int>(); 
tempDictionary.Add("user 1", 5); 
tempDictionary.Add("user 2", 3); 
tempDictionary.Add("user 3", 5); 

Console.WriteLine(tempDictionary.Min(x => x.Key) + " => " tempDictionary.Min(x => x.Value); 

Powyższe zwraca "użytkownik 1 => 3".

Jak można uzyskać zwrot klucza o najniższej wartości ze słownika? Dane wyjściowe, które szukam, będą wyglądały następująco: "użytkownik2 => 3"

Jakieś pomysły?

+1

możliwe duplikat [dobry sposób na uzyskanie klucza o najwyższej wartości słownika w C#] (http://stackoverflow.com/questions/2805703/good-way-to-get-the-key -do-najwyższej-wartości-a-słownika-in-c-ostre) (i na koniec edycje odpowiedzi na to odzwierciedlają) –

Odpowiedz

19

użyciu morelinq

var keyR = tempDictionary.MinBy(kvp => kvp.Value).Key; 

lub

var min = tempDictionary.Aggregate((l, r) => l.Value < r.Value ? l : r).Key; 

od Highest value of a Dictionary in C#

+0

Doskonały, dokładnie to, co robiłem w zwykłym linq. Właśnie czekam na stackoverflow, więc mogę oznaczyć to jako odpowiedź, której szukałem. Dzięki :) – Dezzamondo

3
var keyAndValue = tempDictionary.OrderBy(kvp => kvp.Value).First(); 
Console.WriteLine("{0} => {1}", keyAndValue.Key, keyAndValue.Value); 

Jeśli zestaw danych jest nietrywialne wielkości, można rozważyć rozszerzenie MinBy w moreLinq. Here's an implementation hostowany na SO.

+0

Dzięki nieopłacaniu, na szczęście rozmiar listy będzie dość banalny, ale moreLinq wygląda na użyteczne narzędzie do opanowania. Dziękuję za zwrócenie mi uwagi :) – Dezzamondo

1

Spróbuj tego:
var val = tempDictionary.OrderBy(k => k.Value).FirstOrDefault(); Console.WriteLine(val.Key +" => "+val.Value);

+0

Myślę, że prawdopodobnie bezpieczniej jest wysadzić w pierwszej linii za pomocą 'First', zamiast pozostawić' val' ewentualnie ustawiony na 'null'. W przeciwnym wypadku należy sprawdzić 'null' przed wywołaniem' Console.WriteLine'. – spender

+1

Yap to dobry problem. Myślę, że FirstOrDefault działa dobrze. – Muna

1

Sortowanie jest mniej wydajne, ponieważ wymaga O (n log n), ale wybór minimum powinien być po prostu O (n).

myślę, że to jest prostszy sposób:

tempDictionary.Where(e => e.Value == tempDictionary.Min(e2 => e2.Value)).First() 

pomocą tego można nawet uzyskać wszystkie wartości minimalne, jeśli po prostu usunąć .First()

0

miałem podobny problem i nie jest to korzystne zamawiania wartości słownik, ale po prostu znajdź min za pomocą jednej iteracji (porządek jest> O (N)). Może być konieczne zabezpieczenie przed przypadkami narożnymi i podobnymi.

var s = String.Empty; 
    var min = Int32.MaxValue; 
    foreach (var item in tempDictionary) { 
     if (item.Value < min){ 
      s = item.Key; 
      min = item.Value; 
     } 
    } 

    Console.WriteLine(s + " => " + min); 
Powiązane problemy