假设我有一个班级“Person”
.........
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
并假设我有列表“listOfPerson”
,其中包含15个人......
List<Person> listOfPerson = new List<Person>();
现在我试图让对象形成这个带Max Age的列表...... ..
仔细阅读我不仅仅需要Max Age ...... 但整个对象...。所以我也可以访问具有最大年龄的人的名字.......
感谢.........
答案 0 :(得分:4)
Person oldest = listOfPerson.OrderByDescending(person => person.Age).First();
来自评论
假设我 说....所有最大的人 年龄...(有年龄最大的人的名单 从给定的人名单)?感谢
在这种情况下,找到最大年龄然后对其进行过滤是值得的。有各种方法,但直接的方法是
int maxAge = listOfPerson.Max(person => person.Age);
var oldestPeople = listOfPerson.Where(person => person.Age == maxAge); // .ToList()
如果结果必须是列表而不是ToList()
,请添加可选的IEnumerable<Person>
扩展名。
答案 1 :(得分:1)
listOfPerson.OrderByDescending(x=>x.Age).First();
答案 2 :(得分:1)
如果列表很短,那么排序和选择第一个(如前所述)可能是最简单的。
如果你有一个更长的列表并且排序开始变慢(这可能不太可能),你可以编写自己的扩展方法来执行它(我使用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;
}