C# - 把一个列表分成n个子列表

5
我希望将一个列表分成'n'个子列表。
我有一个导师名单和一个学生名单。每个学生都分配给一个导师,每个导师可以有多个学生。导师名单是动态的 - 它基于表单上复选框的选择进行填充(即可能有一个、三个、六个等等在列表中)。
//A method to assign the Selected Form teachers to the Students
private void AssignFormTeachers(List<FormTeacher> formTeacherList, List<Student> studentList)
{
    int numFormTeachers = formTeacherList.Count;

    //Sort the Students by Course - this ensures cohort identity.
    studentList = studentList.OrderBy(Student => Student.CourseID).ToList();

    //Split the list according to the number of Form teachers
    List<List<Student>> splitStudentList = splitList(numFormTeachers , studentList);
splitList() 方法是我尝试将该列表拆分为学生列表的方法,但我遇到了问题。假设有3个班主任 - 我似乎无法将列表拆分为3个子列表,而是得到了包含3个学生的列表。
我真的很希望能得到这方面的帮助。我已经搜索了可能的解决方案,但每次都会得到大小为'n'的列表,而不是'n'个列表。如果此问题以前被回答过,请指向那个答案的方向。

1
你尝试过使用GroupBy来解决这个问题吗? - Codeman
1
请不要使用驼峰式命名方法名... splitList() = SplitList()... 请参见 => http://msdn.microsoft.com/zh-cn/library/4df752aw(v=vs.71).aspx - Shiva
1个回答

17
你想将列表分成包含相同数量元素的 n 个部分吗? 尝试使用 GroupBy
var splitStudentList = studentList.Select((s, i) => new { s, i })
                                  .GroupBy(x => x.i % numFormTeachers)
                                  .Select(g => g.Select(x => x.s).ToList())
                                  .ToList();

或者你可以创建自己的扩展方法来实现这一点。我在我的博客上描述了如何做到这一点: 使用LINQ分割集合:不同的方法,不同的性能,相同的结果

public IEnumerable<IEnumerable<T>> Partition<T>(IEnumerable<T> source, int size)
{
    var partition = new List<T>(size);
    var counter = 0;

    using (var enumerator = source.GetEnumerator())
    {
        while (enumerator.MoveNext())
        {
            partition.Add(enumerator.Current);
            counter++;
            if (counter % size == 0)
            {
                yield return partition.ToList();
                partition.Clear();
                counter = 0;
            }
        }

        if (counter != 0)
            yield return partition;
    }
}

使用方法:

var splitStudentList = studentList.Partition(numFormTeachers)
                                  .Select(x => x.ToList())
                                  .ToList();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接