Linq从groupby中选择1,取null或空,除非有数字1

本文关键字:或空 数字 null 选择 Linq groupby | 更新日期: 2023-09-27 18:17:47

很抱歉这个尴尬的标题,这是一个我不知道如何处理的简单问题。假设我们有一个对象列表(在本例中是要联系的父对象):

class Student
{
    public string Id { get; set; }
    public string Parent { get; set; }
    public string Order { get; set; }
}
List<Student> students = new List<Student>();
students.Add(new Student() { Id = "111", Parent = Grandma, Order=   });
students.Add(new Student() { Id = "111", Parent = Mom, Order = 1 });
students.Add(new Student() { Id = "111", Parent = Dad, Order = 2 });
students.Add(new Student() { Id = "222", Parent = Mom, Order = 1 });
students.Add(new Student() { Id = "222", Parent = Dad, Order = 2 });
students.Add(new Student() { Id = "333", Parent = Mom, Order =  });
students.Add(new Student() { Id = "444", Parent = Dad, Order =  });

期望的返回值:

111 Mom
222 Mom
333 Mom
444 Dad

如果不是像student 111这样的实例,我可以使用Linq:

data.GroupBy(s => s.PupilNumber).Select(s => s.OrderBy(p => p.OrderBy)).Select(s => s.First()).ToList();

但是对于学生111,这里返回的是Grandma,而我想返回的是Mom。我不能清除空OrderBys,因为那样我就不能得到学生333和444的妈妈和爸爸。

任何想法?

Linq从groupby中选择1,取null或空,除非有数字1

尝试使用如下命令将空顺序强制放到列表的底部:

students.GroupBy(s => s.Id).Select(s => s.OrderBy(p => p.Order ?? 9999)).Select(s => s.First()).ToList();

您可以使用任意低优先级预先编辑它们:

data.Select(s => new { s.Id, s.Parent, Order = s.Order ?? int.MaxValue.toString() }).GroupBy(s => s.PupilNumber)...