从列表中获取所需对象...

时间:2011-04-22 05:27:09

标签: c# .net linq

假设我有一个班级“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 ...... 但整个对象...。所以我也可以访问具有最大年龄的人的名字.......

感谢.........

3 个答案:

答案 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;
}