【问题标题】:Splitting a list or collection into chunks [duplicate]将列表或集合拆分成块[重复]
【发布时间】:2015-07-26 16:44:05
【问题描述】:

我有一个程序可以将文件的内容读入某种列表或数组。这个列表/数组可以包含任意数量的项目。我需要将它分成更小的组,例如每组 50 个项目,然后对每个组中的每个项目进行一些处理。

List<string> stuffFromFile = new List<string>();

while ((line = fileReader.ReadLine()) != null)
      {
           stuffFromFile.Add(line);
      }

我一直在网上浏览一些关于如何分块的示例,但老实说,我并不真正理解这些示例,其中一些似乎过于复杂。我只需要一些简单的东西,将原始项目列表分块/拆分/分解为 50 个组,然后让我遍历每个组中的每个项目,直到处理完成。

读入的项目总数很可能不是我可以除以 50 的数字,因此最后一组可能包含少于 50 个项目,但仍需要像其他项目一样进行处理。

有人可以帮忙吗?听起来应该很简单,但我真的不知道该怎么做。我看过有关使用 LINQ 的示例,但我也不明白。

【问题讨论】:

  • 我想这可能就是你要找的东西:*.com/questions/11463734/…
  • 刚读50,处理,重复有什么问题?
  • 当最终目标是处理每个项目时,为什么要分组?
  • 处理数据的系统只能接受小团体的东西。

标签: c# arrays list split


【解决方案1】:

这是一种适用于任何列表和任何大小的块的扩展方法。

public static List<List<T>> SplitList<T>(this List<T> me, int size = 50)
{
    var list = new List<List<T>>();
    for (int i = 0; i < me.Count; i += size)
        list.Add(me.GetRange(i, Math.Min(size, me.Count - i)));
    return list;
} 

像这样使用它:

List<List<string>> chunksOf50 = stuffFromFile.SplitList();

【讨论】:

  • 如何遍历该 chunksOf50 列表中的每个项目?
  • @irldev foreach (List&lt;string&gt; chunk in chunksOf50)
  • 对你来说,像嵌套 foreach 循环这样简单的东西。 foreach(List&lt;string&gt; listOfStrings in chunksOf50){ foreach(string chunk in listOfStrings){//do stuff}};
  • 谢谢,这似乎有效。
【解决方案2】:
List<string> stuffFromFile = new List<string>() { "1", "2", "3", "4" }; //contents

while (stuffFromFile.Count > 0)
{
    List<string> newChunk = stuffFromFile.Take(50).ToList(); //Take up to 50 elements
    stuffFromFile.RemoveRange(0, newChunk.Count); // Remove the elements you took
}

【讨论】: