web-dev-qa-db-fra.com

Comment obtenir la valeur MAX du dictionnaire?

J'ai 

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

Comment puis-je obtenir une Guid qui a MAX valeur?

22
Terminador

Puisque c'était la réponse acceptée, je vais essayer de couvrir tous les sens possibles de la question:

var dict = new Dictionary<string, int> { { "b", 3 }, { "a", 4 } };

// greatest key
var maxKey = dict.Keys.Max(); // "b"

// greatest value
var maxValue = dict.Values.Max(); // 4

// key of the greatest value
// 4 is the greatest value, and its key is "a", so "a" is the answer.
var keyOfMaxValue = dict.Aggregate((x, y) => x.Value > y.Value ? x : y).Key; // "a"

Remarque: le type de clé est System.Guid. Il n’est peut-être pas logique de demander "quel est le plus grand GUID", car ils sont simplement destinés à être des valeurs uniques, plutôt que de représenter un concept ordonnable. Néanmoins, le code ci-dessus fonctionnera avec tout type prenant en charge l'opérateur >, string et int étant choisis ici pour des raisons de concision.

40
Asik

Cela fonctionne très bien. Il renverra le GUID pour la date MAX.

Dictionary<Guid, DateTime> d = new Dictionary<Guid, DateTime>(); 
var guidForMaxDate = d.FirstOrDefault(x => x.Value == d.Values.Max()).Key;
38
Papa Burgundy
            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());
10
Steven P

Commander vos données en premier lieu pourrait être une solution.

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

Guid implémente IComparable, donc:

d.Keys.Max()

En outre, il n’est pas clair pourquoi on voudrait le faire ...

5
Alexei Levenkov

En utilisant LINQ sur le dictionnaire.

var MaximumValue = dict.FirstOrDefault(x => x.Value.Equals(dict.Values.Max()));
1
Hamza KhãñzãDã

La réponse acceptée n'a pas fonctionné pour moi. Le code suivant (utilisant MoreLinq) a cependant fait le travail:

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

Une autre façon pourrait aider à obtenir Single KeyValuePair.

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