假设我有一个类“Person”
……
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
假设我有清单“listOfPerson”
,其中包含15个人…
List<Person> listOfPerson = new List<Person>();
现在,我试图让对象从这个列表中获得最大年龄…。。
仔细阅读我不仅仅需要最大年龄……但是整个对象……所以我也可以访问具有最大年龄的人的姓名
谢谢……
Person oldest = listOfPerson.OrderByDescending(person => person.Age).First();
来自评论
假设我说所有带max的人年龄(年龄最大的人列表从给定的人员列表中(?感谢
在这种情况下,找到最大年龄,然后对其进行过滤是值得的。有各种方法,但一种简单的方法是
int maxAge = listOfPerson.Max(person => person.Age);
var oldestPeople = listOfPerson.Where(person => person.Age == maxAge); // .ToList()
如果重要的是结果是列表而不是IEnumerable<Person>
,则包括可选的ToList()
扩展。
listOfPerson.OrderByDescending(x=>x.Age).First();
如果列表很短,那么排序并选择第一个(如前所述(可能是最简单的。
如果你有一个更长的列表,并且排序开始变慢(这可能不太可能(,你可以编写自己的扩展方法来完成它(我使用MaxItem是因为我认为只有Max会与现有的LINQ方法冲突,但我太懒了,找不到(。
public static T MaxItem<T>(this IEnumerable<T> list, Func<T, int> selector) {
var enumerator = list.GetEnumerator();
if (!enumerator.MoveNext()) {
// Return null/default on an empty list. Could choose to throw instead.
return default(T);
}
T maxItem = enumerator.Current;
int maxValue = selector(maxItem);
while (enumerator.MoveNext()) {
var item = enumerator.Current;
var value = selector(item);
if (value > maxValue) {
maxValue = value;
maxItem = item;
}
}
return maxItem;
}
或者,如果您需要退回所有最大项目:
public static IEnumerable<T> MaxItems<T>(this IEnumerable<T> list, Func<T, int> selector) {
var enumerator = list.GetEnumerator();
if (!enumerator.MoveNext()) {
return Enumerable.Empty<T>();
}
var maxItem = enumerator.Current;
List<T> maxItems = new List<T>() { maxItem };
int maxValue = selector(maxItem);
while (enumerator.MoveNext()) {
var item = enumerator.Current;
var value = selector(item);
if (value > maxValue) {
maxValue = value;
maxItems = new List<T>() { item };
} else if (value == maxValue) {
maxItems.Add(item);
}
}
return maxItems;
}