如何在C#中根据索引拆分列表?

Awe*_*ome 10 c# split list

我现在有一个包含大约190个元素的列表.如何将列表拆分为每个列表中最多包含50个元素的较小列表?

结果可能是50,50,50和40个元素的列表.

Jon*_*eet 21

假设您的意思是List<T>,您可以GetRange重复使用该方法.哎呀,你可以用LINQ做到这一点:

var lists = Enumerable.Range(0, (list.Count + size - 1) / size)
      .Select(index => list.GetRange(index * size,
                                     Math.Min(size, list.Count - index * size)))
      .ToList();
Run Code Online (Sandbox Code Playgroud)

或者你可以只使用一个循环,当然:

public static List<List<T>> Split(List<T> source, int size)
{
    // TODO: Prepopulate with the right capacity
    List<List<T>> ret = new List<List<T>>();
    for (int i = 0; i < source.Count; i += size)
    {
        ret.Add(source.GetRange(i, Math.Min(size, source.Count - i)));
    }
    return ret;
}
Run Code Online (Sandbox Code Playgroud)

这比使用更有效GroupBy,尽管它仅限于List<T>输入.

我们IEnumerable<T>Batch.cs中的MoreLINQ中使用了另一个实现.


Dar*_*rov 10

您可以使用LINQ:

var list = Enumerable.Range(1, 190);
var sublists = list
    .Select((x, i) => new { Index = i, Value = x })
    .GroupBy(x => x.Index / 50)
    .Select(x => x.Select(v => v.Value).ToList())
    .ToArray();
Run Code Online (Sandbox Code Playgroud)