LINQ从List <t>中的多个类似记录中选择最小字段值

时间:2016-06-16 18:02:06

标签: c# linq

我试图找出如何在T-SQL中作为一个组和聚合过程来做我所知道的。

我有一个List,在该列表中我有每个实例的2条记录。我需要值较低的记录。

所以在申请中我有学生记录。所以我的清单会是这样的:

0    studentid 1    score 75.345
1    studentid 1    score 33.653
2    studentid 2    score 94.876
3    studentid 2    score 15.234
etc....

我在List结果中有这些记录:

var result = abc.Find<Student>...snip

要明确业务规则要求在两者之间找到较低的分数。

那么我如何在Linq中完成这个过滤和选择呢?我看到有Group和聚合Linq扩展,但老实说不确定这是否是追求的途径。

谢谢

2 个答案:

答案 0 :(得分:3)

使用GroupByMin功能。

var result = context.GroupBy(s=> s.StudentId)
                    .Select(sg => new {
                                        StudentId = sg.Key, 
                                        MinScore = sg.Min(sc=> sc.Score)
                                      });

答案 1 :(得分:0)

也许这会有所帮助:

    using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {
        var s1=new Student(){Id=0, Name="Student 1", Score=56.44};
        var s2=new Student(){Id=1, Name="Student 1", Score=34.45};
        var s3=new Student(){Id=2, Name="Student 2", Score=56.23};
        var s4=new Student(){Id=3, Name="Student 2", Score=98.54};

    var list=new List<Student>(){s1,s2,s3,s4};

    var select=list.OrderBy(x=>x.Score).GroupBy(x=>x.Name);

    var newList=new List<Student>();

    foreach (var item in select){

        newList.Add(item.First());

    }

    foreach (var item in newList){

        Console.WriteLine(item.Id +"/"+item.Name +"/"+item.Score);
    }
}

public class Student
{
    public int Id {get;set;}
    public string Name {get;set;}
    public double Score {get;set;}
    }
  }

首先,您需要order by分数,然后group-by名称,然后从每个组中取first

dotnetfiddle