C#中 Lambda语法实现范围分组查询

这篇博客介绍了如何使用C#进行数据分组查询,以实现对学生考试成绩按10分一档的分类。通过定义Student类和数据,然后利用LINQ查询,计算每个学生的平均分数并分组,最终输出每个分数段内的学生名单。示例代码清晰地展示了整个过程。
摘要由CSDN通过智能技术生成

       今天有时间查看了一下C#的教程,发现个有意思的算法。如果你是个老师,需要对班里的学生考试成绩进行分类查询,每10分一个档。这是不是想想也头疼,改如何实现呢,而且语法又要优美。微软官方网站给出了不错的示例,一起来学习一下。

1、首先定义类和数据。

public class StudentClass
{
#region data
protected enum GradeLevel { FirstYear = 1, SecondYear, ThirdYear, FourthYear };
protected class Student
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int ID { get; set; }
public GradeLevel Year;
public List<int> ExamScores;
}

protected static List<Student> students = new List<Student>
{
new Student {FirstName = "Terry", LastName = "Adams", ID = 120,
Year = GradeLevel.SecondYear,
ExamScores = new List<int>{ 99, 82, 81, 79}},
new Student {FirstName = "Fadi", LastName = "Fakhouri", ID = 116,
Year = GradeLevel.ThirdYear,
ExamScores = new List<int>{ 99, 86, 90, 94}},
new Student {FirstName = "Hanying", LastName = "Feng", ID = 117,
Year = GradeLevel.FirstYear,
ExamScores = new List<int>{ 93, 92, 80, 87}},
new Student {FirstName = "Cesar", LastName = "Garcia", ID = 114,
Year = GradeLevel.FourthYear,
ExamScores = new List<int>{ 97, 89, 85, 82}},
new Student {FirstName = "Debra", LastName = "Garcia", ID = 115,
Year = GradeLevel.ThirdYear,
ExamScores = new List<int>{ 35, 72, 91, 70}},
new Student {FirstName = "Hugo", LastName = "Garcia", ID = 118,
Year = GradeLevel.SecondYear,
ExamScores = new List<int>{ 92, 90, 83, 78}},
new Student {FirstName = "Sven", LastName = "Mortensen", ID = 113,
Year = GradeLevel.FirstYear,
ExamScores = new List<int>{ 88, 94, 65, 91}},
new Student {FirstName = "Claire", LastName = "O'Donnell", ID = 112,
Year = GradeLevel.FourthYear,
ExamScores = new List<int>{ 75, 84, 91, 39}},
new Student {FirstName = "Svetlana", LastName = "Omelchenko", ID = 111,
Year = GradeLevel.SecondYear,
ExamScores = new List<int>{ 97, 92, 81, 60}},
new Student {FirstName = "Lance", LastName = "Tucker", ID = 119,
Year = GradeLevel.ThirdYear,
ExamScores = new List<int>{ 68, 79, 88, 92}},
new Student {FirstName = "Michael", LastName = "Tucker", ID = 122,
Year = GradeLevel.FirstYear,
ExamScores = new List<int>{ 94, 92, 91, 91}},
new Student {FirstName = "Eugene", LastName = "Zabokritski", ID = 121,
Year = GradeLevel.FourthYear,
ExamScores = new List<int>{ 96, 85, 91, 60}}
};
#endregion


//这里是精华,将学生的考试成绩先平均再缩小10倍,为的是分组。
protected static int GetPercentile(Student s)
{
    double avg = s.ExamScores.Average();
    return avg > 0 ? (int)avg / 10 : 0;
}

public void GroupByRange()
{
Console.WriteLine("\r\nGroup by numeric range and project into a new anonymous type:");

//先得出成绩数据,再依据此数据分组,输出

var queryNumericRange = from student in students
                                        let percentile = GetPercentile(student)
                                        group new { student.FirstName, student.LastName } by                                         percentile into percentGroup  orderby percentGroup.Key
                                        select percentGroup;


foreach (var studentGroup in queryNumericRange)
{

//分组数再扩大10倍,这样以10分为一个阶段的统计就实现了。
Console.WriteLine($"Key: {studentGroup.Key * 10}");
foreach (var item in studentGroup)
{
Console.WriteLine($"\t{item.LastName}, {item.FirstName}");
}
}
}

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            var sc = new StudentClass();
            sc.GroupByRange();
        }
    }
 

/* Output:
Group by numeric range and project into a new anonymous type:
Key: 60
        Garcia, Debra
Key: 70
        O'Donnell, Claire
Key: 80
        Adams, Terry
        Feng, Hanying
        Garcia, Cesar
        Garcia, Hugo
        Mortensen, Sven
        Omelchenko, Svetlana
        Tucker, Lance
        Zabokritski, Eugene
Key: 90
        Fakhouri, Fadi
        Tucker, Michael
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值