从列表中获取所需对象…

本文关键字:对象 获取 列表 | 更新日期: 2023-09-27 17:52:37

假设我有一个类“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;
}