2009-09-28 105 views
13

我创建了一个list<T>包含对象的集合,有这样的特性:XYZ选择最大年龄C#

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

我试图用Max()功能,但我不明白如何使用它......

+1

@ csharptest.net:请重新设置您的答案,LINQ并不总是最好的答案,如果列表很大,您的击败LINQ答案。 – AnthonyWJones 2009-09-28 20:19:33

回答

26

马克斯是用来寻找一个属性的最大值。获得最大值后,您可以使用Where子句选择其值匹配的对象。

var maxZ = list.Max(obj => obj.Z); 
var maxObj = list.Where(obj => obj.Z == maxZ); 
+3

请注意,这会在列表上进行两次传递,并可能返回多个对象。这些属性可能会或可能不会成为您自己的应用程序的关注点。 – Brian 2009-09-28 20:19:36

+0

如果list.Count很大,那不完全是高性能的。 – user7116 2009-09-28 20:21:28

+0

+1为你从我的答案,虽然我不喜欢小写L(我明白是列表,但看起来像我最喜欢的数字之一吓人)。 – 2009-09-28 20:23:04

7
int maxAge = myList.Max(obj => obj.Z); 

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

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

,注意,如果两个或多个项目都有最高年龄的,只其中之一被选中。

+0

获得maxAge,但它不会告诉你哪个对象具有maxAge – AnthonyWJones 2009-09-28 20:15:03

+0

,但是这将返回正确的X值? 我想检索最高的对象X – Killercode 2009-09-28 20:15:10

+0

请注意,您将需要使用指令“using System.Linq;”在文件的顶部。 – 2009-09-28 20:16:48

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); 
16

要获得最大的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); 
    } 
} 
+0

+1,可选:list.OrderByDescending(x => x.Z).First() – user7116 2009-09-28 20:20:55

+0

这里有几个问题。首先,排序最多为O(nlogn),其中查找最大值和提取匹配元素都是O(n)。其次,这只会给你第一场比赛。没关系,如果这些值是唯一的,或者您只关心获取任何匹配元素,但是如果您需要所有匹配元素,则仍然必须找到最大值,然后提取匹配项。 – tvanfosson 2009-09-28 20:21:20

+1

@sixlettervariables:是的,我知道它在那里,但它没有出现在'List '文档中,所以我不得不挖掘一下... – Guffa 2009-09-28 20:26:37

1

如果可以实现既沿着这些路线上你的类IComparable<T>IComparable

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

您只需致电(需要using System.Linq)即可获得最大价值:

MyClass maxObject = list.Max(); 

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

相关问题