web-dev-qa-db-fra.com

Sélectionnez l'âge maximum C #

J'ai créé un list<T> qui contient une collection d'objets ayant les propriétés suivantes: X, Y, Z

Je veux savoir quel objet de la collection a le plus grand Z

J'ai essayé d'utiliser la fonction Max() mais je ne comprends pas comment elle est utilisée ...

14
Killercode

Max est utilisé pour trouver la valeur maximale d'une propriété. Une fois que vous avez la valeur maximale, vous pouvez sélectionner les objets dont la valeur correspond à l'aide de la clause Where.

var maxZ = list.Max( obj => obj.Z );
var maxObj = list.Where( obj => obj.Z == maxZ );
29
tvanfosson

Pour obtenir l'objet avec la plus grande valeur Z, triez-le par ordre décroissant et obtenez le premier élément:

TypeOfObject oldest = list.OrderByDescending(x => x.Z).First();

Modifier:
L'a modifiée pour utiliser la méthode IEnumerable.OrderByDescending au lieu de List.Sort.

Edit 2:
Si vous voulez de la performance, elle est environ quatre fois plus rapide que la solution LINQ la plus rapide:

int high = Int32.MinValue;
List<TypeOfObject> highest = new List<TypeOfObject>();
foreach (TypeOfObject v in list) {
   if (v.Z >= high) {
      if (v.Z > high) highest.Clear();
      high = v.Z;
      highest.Add(v);
   }
}
17
Guffa
int maxAge = myList.Max(obj => obj.Z);

Le paramètre utilisé est une expression lambda. Cette expression indique quelle propriété utiliser (dans ce cas, Z) pour obtenir la valeur maximale. Cela aura l'âge maximum. Si vous voulez l'objet qui a le plus grand âge, vous pouvez trier par âge et obtenir le premier résultat:

MyType maxItem = myList.OrderByDescending(obj => obj.Z).First();

Si vous procédez ainsi, notez que si deux éléments ou plus ont tous l'âge maximum, un seul d'entre eux est sélectionné.

7
Meta-Knight

If peut implémenter IComparable<T> ou IComparable sur votre classe de la manière suivante:

public Int32 CompareTo(MyClass other) {
  return Z.CompareTo(other.Z);
}

Vous pouvez obtenir la valeur maximale simplement en appelant (cela nécessitera using System.Linq):

MyClass maxObject = list.Max();

Cela ne fera qu'un seul passage sur votre liste de valeurs.

1
Martin Liversage

Cela dépendra beaucoup du type de X, s'il est comparable:

var array = new[] { 
    new { X = "a", Y = "a", Z = 1 }, 
    new { X = "b", Y = "b", Z = 2 } 
};
var max = array.Max(x => x.Z);
Console.WriteLine(max);
0
Darin Dimitrov