Linq从groupby中选择一个,除非有数字1,否则取空或空

时间:2014-08-12 21:50:39

标签: c# linq

对于这个尴尬的标题感到抱歉,这是一个简单的问题,有一个额外的扭曲,我无法弄清楚如何处理。假设我们有一个对象列表(在这种情况下,要联系的父级):

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

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

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

但是这会给111号学生送奶奶,我想要归还妈妈。我无法清理空的OrderBys,因为那样我就不会为学生333和444找到妈妈和爸爸。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

尝试使用以下内容将空订单强制到列表底部:

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

这有点俗气,但它确实有效。

答案 1 :(得分:1)

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

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