19

我创建了一个list<T>包含具有以下属性的对象集合:X、、YZ

我想找出集合中哪个对象最大Z

我尝试使用该Max()功能,但我不明白它是如何使用的...

4

5 回答 5

35

Max 用于查找属性的最大值。获得最大值后,您可以使用 Where 子句选择值匹配的那些对象。

var maxZ = list.Max( obj => obj.Z );
var maxObj = list.Where( obj => obj.Z == maxZ );
于 2009-09-28T20:16:22.720 回答
20

要获取具有最大 Z 值的对象,请按 Z 值降序排序并获取第一项:

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

编辑:
将其更改为使用 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);
   }
}
于 2009-09-28T20:16:56.820 回答
7
int maxAge = myList.Max(obj => obj.Z);

使用的参数是一个 lambda 表达式。此表达式指示使用哪个属性(在本例中为 Z)来获取最大值。这将获得最大年龄。如果你想要年龄最大的对象,你可以按年龄排序并得到第一个结果:

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

如果您这样做,请注意,如果两个或多个项目都具有最大年龄,则仅选择其中一个。

于 2009-09-28T20:13:13.107 回答
1

如果可以按照以下方式实现IComparable<T>IComparable在您的类上实现:

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

您只需调用即可获得最大值(这将需要using System.Linq):

MyClass maxObject = list.Max();

这只会对您的值列表执行一次传递。

于 2009-09-28T20:28:17.720 回答
0

它在很大程度上取决于 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);
于 2009-09-28T20:15:28.290 回答