C# 选择最大年龄C
我创建了一个列表,其中包含具有以下属性的对象集合:X、Y、Z 我想找出集合中哪个对象的Z最大 我试着使用Max函数,但我不明白它是如何使用的C# 选择最大年龄C,c#,list,max,C#,List,Max,我创建了一个列表,其中包含具有以下属性的对象集合:X、Y、Z 我想找出集合中哪个对象的Z最大 我试着使用Max函数,但我不明白它是如何使用的 int maxAge = myList.Max(obj => obj.Z); 使用的参数是lambda表达式。此表达式指示在本例中使用哪个属性Z来获取最大值。这将获得最大年龄。如果您想要具有最大年龄的对象,可以按年龄排序并获得第一个结果: MyType maxItem = myList.OrderByDescending(obj => obj
int maxAge = myList.Max(obj => obj.Z);
使用的参数是lambda表达式。此表达式指示在本例中使用哪个属性Z来获取最大值。这将获得最大年龄。如果您想要具有最大年龄的对象,可以按年龄排序并获得第一个结果:
MyType maxItem = myList.OrderByDescending(obj => obj.Z).First();
如果这样做,请注意,如果两个或两个以上的项目都具有最大年龄,则只会选择其中一个项目。如果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);
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();
编辑:
将其更改为使用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);
}
}
If可以在类上按照以下方式实现IComparable或IComparable:
public Int32 CompareTo(MyClass other) {
return Z.CompareTo(other.Z);
}
您只需调用即可获得最大值,这将需要使用System.Linq:
这将只对值列表执行一次传递。获取最大值,但不会告诉您哪个对象具有该最大值,但这将返回X值,对吗???我想检索XNote值最高的对象,您需要使用System.Linq;在您的文件顶部。@csharptest.net:请重新恢复您的答案,如果列表很大,LINQ并不总是最佳答案。请注意,这会在列表上重复两次,并可能返回多个对象。这些属性可能与您自己的应用程序有关,也可能与您自己的应用程序无关。+1对于我的回答,尽管我不喜欢小写字母L,我知道它代表列表,但看起来非常像我最喜欢的数字之一。我同意这不一定是最快的,但它非常干净,除非列表非常大,否则它应该非常快。根据设计,它将返回多个匹配项。如果您只想要第一个,请将Where改为FirstOrDefault。我同意这是使用内置函数实现这一点的最干净的方法。这里有几个问题。首先,排序充其量是Onlogn,查找最大值和提取匹配元素都是Onlogn。第二,这只会给你第一场比赛。如果值是唯一的,或者您只关心获取任何匹配元素,那没关系,但是如果您需要所有匹配元素,您仍然需要找到最大值,然后提取匹配项。@sixlettervariables:是的,我知道它在某个地方,但它没有显示在“列表”文档中,所以我不得不挖掘一些…@tvanfosson:是的,但另一方面,您不必枚举整个集合两次。如果有多个项目可以具有最大值,则所有项目都位于结果的开头,因此它们很容易获得。@Guffa for n>4,2*n
MyClass maxObject = list.Max();