2012-04-24 19 views
16

HoCome ottenere il valore MAX dal dizionario?

Dictionary<Guid, DateTime> d = new Dictionary<Guid, DateTime>(); 

Come posso ottenere un Guid che ha MAX valore?

+3

possibile duplicato del [Get Max() del valore alfanumerico] (http://stackoverflow.com/questions/7268605/get-max-of-alphanumeric-value) –

+0

Si prega di provare a fare la propria ricerca prima di fare una domanda su SO. –

+1

Poiché "GUID" sta per "identificatore univoco globale", sembra incredibilmente strano che tu voglia un valore "massimo". Un GUID è utilizzato a causa della sua unicità; Non riesco a pensare a un'applicazione del mondo reale in cui abbia senso pensarli come se fossero ordinati. – jpmc26

risposta

29

utilizzando LINQ:

d.Keys.Max(); // Returns the greatest key 
+7

Ma ha chiesto la chiave che ha il valore massimo. Questo ci dà solo la chiave massima, quindi è la cosa sbagliata. – robbpriestley

+0

La domanda può essere interpretata in entrambi i modi, e dal momento che l'OP ha accettato questa risposta, posso supporre che questo fosse ciò che intendeva. – Asik

5

Guid implementa IComparable, quindi:

d.Keys.Max() 

Inoltre non è chiaro il motivo per cui ci si vuole fare in modo ...

9
  var maxGuid = Guid.Empty; 
      var maxDateTime = DateTime.MinValue; 
      foreach (var kvp in d) 
      { 
       if (kvp.Value > maxDateTime) 
       { 
        maxGuid = kvp.Key; 
        maxDateTime = kvp.Value; 
       } 
      } 
      Console.WriteLine("Guid of max date is: " + maxGuid.ToString()); 
+1

Supponendo che si desideri il GUID per il massimo DateTime ... –

+1

Rileggendo la domanda, penso che questa sia l'interpretazione corretta e l'unica risposta che fornisce il risultato corretto (sebbene sospetto che potrebbe essere abbreviato con LINQ, non sarà più veloce di questo ciclo esplicito). –

+0

@BenVoigt ciclo esplicito è il miglior affare qui in termini di chiarezza. Un altro post [qui] (https://stackoverflow.com/q/2805703/465053) con alcune ottime risposte. La risposta accettata in questo post afferma di avere una scansione singola utilizzando LINQ. – RBT

29

Questo funziona alla grande. Restituirà il GUID per la data MAX.

Dictionary<Guid, DateTime> d = new Dictionary<Guid, DateTime>(); 
var guidForMaxDate = d.FirstOrDefault(x => x.Value == d.Values.Max()).Key; 
+1

Il codice solido fa il lavoro –

+0

Bello, anche se otterrei che 'd.Values.Max()' esca in una variabile in anticipo, altrimenti probabilmente ripeterò la ricerca di Max() in ogni singola iterazione. – Nyerguds

0

Un altro modo potrebbe aiuta a ottenere singolo KeyValuePair.

KeyValuePair<char, int> GuidKeyPair = guidDict.FirstOrDefault(MaxGuid => MaxGuid.Value == guidDict.Values.Max()); 
5

ordinazione i dati in primo luogo potrebbe essere una soluzione.

var maxGuid = d.OrderByDescending(x => x.Value).FirstOrDefault().Key; 
0

La risposta accettata non ha funzionato per me. Il seguente codice (utilizzando MoreLinq) ha funzionato correttamente:

var fooDict = new Dictionary<string, int>(); 
var keyForBiggest = fooDict.MaxBy(kvp => kvp.Value).Key; 
var biggestInt = fooDict[keyForBiggest]; 
0

Utilizzando LINQ sul dizionario.

var MaximumValue = dict.FirstOrDefault(x => x.Value.Equals(dict.Values.Max())); 
Problemi correlati