首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对包含另一个列表的对象列表进行分组?

如何对包含另一个列表的对象列表进行分组?
EN

Stack Overflow用户
提问于 2015-12-07 21:43:52
回答 3查看 243关注 0票数 0

我有一个具有以下属性的类:

代码语言:javascript
复制
public string FirstName { get; set; }
public string LastName { get; set; }
public int ID { get; set; }
public GradeLevel Year;
public List<int> ExamScores;

以及一种方法:

代码语言:javascript
复制
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, 92}},
    new Student {FirstName = "Fadi", LastName = "Fakhouri", ID = 116, 
        Year = GradeLevel.ThirdYear,
        ExamScores = new List<int>{ 99, 81, 90, 94}},
    new Student {FirstName = "Hanying", LastName = "Feng", ID = 117, 
        Year = GradeLevel.FirstYear, 
        ExamScores = new List<int>{ 90, 94, 81, 82}},
}

下一步:

代码语言:javascript
复制
public void GroupByMark()
{
    students.ForEach(mark =>
    {
        var queryNumericRange =
            from student in students
            group new {student.FirstName, student.LastName} by mark
            into percentGroup
            orderby percentGroup.Key
            select percentGroup;
        foreach (var studentGroup in queryNumericRange)
        {
            Console.WriteLine("Key: {0}", (studentGroup.Key));
            foreach (var item in studentGroup)
            {
                Console.WriteLine("\t{0}, {1}", item.LastName, item.FirstName);
            }
        }
    });
}

结果:

代码语言:javascript
复制
key: test.StudentClass+Student
    Adams, Terry
    Fakhouri, Fadi
    Feng, Hanying

key: test.StudentClass+Student
    Adams, Terry
    Fakhouri, Fadi
    Feng, Hanying

key: test.StudentClass+Student
    Adams, Terry
    Fakhouri, Fadi
    Feng, Hanying

期望的结果:

代码语言:javascript
复制
key: 99
    Adams, Terry
    Fakhouri, Fadi

key: 82
    Adams, Terry
    Feng, Hanying

key: 81
    Adams, Terry
    Fakhouri, Fadi

key: 92
    Adams, Terry

key: 90
    Fakhouri, Fadi
    Feng, Hanying

key: 94
    Fakhouri, Fadi
    Feng, Hanying

因此,对于每个分数,我想显示收到该特定分数的学生列表。你知道怎么做吗?

EN

回答 3

Stack Overflow用户

发布于 2015-12-07 21:53:46

Yop可以使用SelectMany来扁平化列表,然后按考试成绩分组,如下所示:

代码语言:javascript
复制
var queryNumericRange = students.SelectMany(x => x.ExamScores, (stuObj, scores) => new
             {
                 StudentName = String.Format("{0},{1}",stuObj.LastName,stuObj.FirstName),
                 ExamScores = scores
             })
             .GroupBy(x => x.ExamScores)
             .Select(x => new
                  {
                      Key = x.Key,
                      StudentNames = x.Select(s => s.StudentName).ToList()
                  });

Working Fiddle

票数 1
EN

Stack Overflow用户

发布于 2015-12-07 21:52:09

下面是你怎么做的:

代码语言:javascript
复制
var results = students
    .SelectMany(score => score.ExamScores) //get all scores from all students
    .Distinct() //remove duplicate scores
    .Select(score => //for each score create a new anonymous object
        new
        {
            Score = score, //That contains the score itself
            Students = students //And the students that have such score
                .Where(student => student.ExamScores.Contains(score)).ToList()
        })
    .ToList();

或者像这样,如果你只关心学生的名字:

代码语言:javascript
复制
var results = students
    .SelectMany(score => score.ExamScores)
    .Distinct()
    .Select(score =>
        new
        {
            Score = score,
            Students = students
                .Where(student => student.ExamScores.Contains(score))
                .Select(student => student.LastName + ", " + student.FirstName)
                .ToList()
        })
    .ToList();

下面是在后一种情况下循环结果的方法:

代码语言:javascript
复制
foreach (var result in results)
{
    Console.WriteLine("Score: " + result.Score);

    foreach (var student in result.Students)
    {
        Console.WriteLine(student);
    }
}
票数 0
EN

Stack Overflow用户

发布于 2015-12-08 00:31:10

这听起来像是您想创建一个学生/分数对序列,然后按分数分组:

代码语言:javascript
复制
var studentsByMark = from student in students
                     from mark in student.ExamScores
                     group student by mark;
foreach (var group in studentsByMark)
{
    Console.WriteLine("{0}:", group.Key); // Mark
    foreach (var student in group)
    {
        Console.WriteLine("{0}, {1}", student.LastName, student.FirstName);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34135049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档