Я создал list<T>
, который содержит коллекцию объектов, обладающих этими свойствами: X
, Y
, Z
Я хочу узнать, какой объект в коллекции имеет наибольший Z
Я попытался использовать функцию Max()
, но я не понимаю, как она использовалась...
Я создал list<T>
, который содержит коллекцию объектов, обладающих этими свойствами: X
, Y
, Z
Я хочу узнать, какой объект в коллекции имеет наибольший Z
Я попытался использовать функцию Max()
, но я не понимаю, как она использовалась...
Макс используется для нахождения максимального значения свойства. После того как вы получите максимальное значение, вы можете выбрать те объекты, значение которых совпадает с предложением Where.
var maxZ = list.Max( obj => obj.Z );
var maxObj = list.Where( obj => obj.Z == maxZ );
Чтобы получить объект с наибольшим значением Z, вы сортируете по значению Z в порядке убывания и получаете первый элемент:
TypeOfObject oldest = list.OrderByDescending(x => x.Z).First();
Edit:
Изменен для использования метода IEnumerable.OrderByDescending вместо List.Sort.
Изменить 2:
Если вам нужна производительность, это примерно в четыре раза быстрее, чем самое быстрое решение LINQ:
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);
}
}
int maxAge = myList.Max(obj => obj.Z);
Используемый параметр - это лямбда-выражение. Это выражение указывает, какое свойство использовать (в данном случае Z), чтобы получить максимальное значение. Это достигнет максимального возраста. Если вам нужен объект с наибольшим возрастом, вы можете сортировать по возрасту и получить первый результат:
MyType maxItem = myList.OrderByDescending(obj => obj.Z).First();
Если вы сделаете это так, обратите внимание, что если два или более элемента имеют максимальный возраст, выбирается только один из них.
Если вы можете реализовать либо IComparable<T>
, либо IComparable
в своем классе в следующих строках:
public Int32 CompareTo(MyClass other) {
return Z.CompareTo(other.Z);
}
Вы можете получить максимальное значение просто путем вызова (для этого потребуется using System.Linq
):
MyClass maxObject = list.Max();
Это будет выполнять только один проход по вашему списку значений.
Это будет во многом зависеть от типа X, если оно сопоставимо:
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);