linq 获取字段具有最大值的对象列表

vlju58qv  于 2023-02-17  发布在  其他
关注(0)|答案(2)|浏览(149)

假设我有这样一个类

public class Person {
    public string name;
    public int age;
    //...
}

假设我有一个Person数组:

Person[] personArray;

如何使用Linq获得personArray内年龄最大的人员列表?
我正在尝试,但我希望有一个一行程序来执行此任务:

public List<Person> GetBiggestAgeList(){
    var sortedPeople = personArray.OrderByDescending(person => person.age).ToList();
    int maxAge = sortedPeople[0].age;
    List<Person> answer = new List<Person>();
    for(int i = 0; i < sortedPeople.Count; ++i){
        if(sortedPeople[i].age == maxAge) answer.Add(sortedPeople[i]);
        else break;
    }
    return answer;
}
uyhoqukh

uyhoqukh1#

一个选择是

var opa = personArray.OrderByDescending(x=>x.age).FirstOrDefault();

得到所有的运算放大器

var allOpas = personArray.Where(x=>x.age == opa.age);

一个内衬为:

var allOpas2 = personArray.OrderByDescending(x=>x.age).GroupBy(x=>x.age).FirstOrDefault().ToList();
6rqinv9w

6rqinv9w2#

实现此目的的几个选项:

选项1

使用链接.Max()documentation

// structured
var max = personArray.Max(inner => inner.Age);
var list = personArray.Where(p => p.Age == max);

// ...or in an one-liner
var list = personArray.Where(p => p.Age == personArray.Max(inner => inner.Age));

选项2

使用链接.GroupBy() + .FirstOrDefault()documentation

// this will first order your list 
// then group by all the ages and take the first group because this is the group of the persons with the highest age.
var list = personArray.OrderByDescending(p => p.Age)
                      .GroupBy(p => p.Age)
                      .FirstOrDefault()
                      .ToList();

您可以在此处找到一个工作示例dotnet fiddle
我推荐使用.Max()的选项1比选项2更有效、更快,正如您在dotnet小提琴上看到的那样。要使它真正最快,请将选项1用作两个线性程序,首先解析.Max(),然后再执行.Where(..)

相关问题