将列表或集合拆分为块

5

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

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

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

我一直在网上查阅一些有关如何对数据进行分块的例子,但老实说,我并不太理解这些例子,有些过于复杂了。我只需要一种简单的方法,将原始项目列表分成50个一组,并让我可以迭代每个组中的每个项目,直到处理完成。
读取的总项目数很可能无法被50整除,因此最后一组可能包含少于50个项目,但仍需要像其他组一样进行处理。
有人能帮忙吗?听起来应该很简单,但我真的不知道该怎么做。我看过使用LINQ的例子,但我也不理解它。

我觉得这可能是你在寻找的内容: https://dev59.com/_mgu5IYBdhLWcg3wQE0D - Malte R
仅仅读取50个,处理,然后重复有什么问题吗? - paparazzo
为什么在最终目标是处理每个项时,你要将它们分成组? - imlokesh
处理数据的系统只能接受小批量的内容。 - irldev
2个回答

28

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

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
@irldev foreach (List<string> chunk in chunksOf50) 在chunksOf50中的每个List<string>块上执行以下操作: - Zer0
对于像您这样的专业人士,以下是一个简单的嵌套foreach循环示例。foreach(List<string> listOfStrings in chunksOf50){ foreach(string chunk in listOfStrings){//do stuff}}; - Lee Harrison
谢谢,这似乎有效。 - irldev

4
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
}

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