从列表中获取 5 个字符串的组

本文关键字:字符串 列表 获取 | 更新日期: 2023-09-27 18:34:04

我有一个List<string>,我想从中取出 5 个项目的组。 没有键或任何简单的分组...但它将始终是 5 的倍数。

例如

{"A","16","49","FRED","AD","17","17","17","FRED","8","B","22","22","107","64"}

以以下一组为例:

"A","16","49","FRED","AD"
"17","17","17","FRED","8"
"B","22","22","107","64"

但我无法找到一个简单的方法来做到这一点!

很确定它可以通过枚举和 Take(5) 来完成......

从列表中获取 5 个字符串的组

您可以使用整数除法技巧:

List<List<string>> groupsOf5 = list
    .Select((str, index) => new { str, index })
    .GroupBy(x => x.index / 5)
    .Select(g => g.Select(x => x.str).ToList())
    .ToList();
 List<List<string>> result = new List<List<string>>();
 for(int i = 0; i < source.Count; i += 5 )
      result.Add(source.Skip(i).Take(5).ToList());

喜欢这个?

在常见的编程语法中:

     public List<List<string>> Split(List<string> items, int chunkSize = 5)
     {
         int chunkCount = items.Count/chunkSize;
         List<List<string>> result = new List<List<string>>(chunkCount);
         for (int i = 0; i < chunkCount; i++ )
         {
             result.Add(new List<string>(chunkSize));
             for (int j = i * chunkSize; j < (i + 1) * chunkSize; j++)
             {
                 result[i].Add(items[j]);
             }
         }
         return result;
     }

它是 O((N/ChunkSize) x ChunkSize) = O(N) ,这是线性的。

我推荐Batch库中MoreLINQ方法:

var result = list.Batch(5).ToList();

使用 Take() 和 Skip() 来实现这一点:

        List<string> list = new List<string>() { "A", "16", "49", "FRED", "AD", "17", "17", "17", "FRED", "8", "B", "22", "22", "107", "64" };
        List<List<string>> result = new List<List<string>>();
        for (int i = 0; i < list.Count / 5; i++)
        {
            result.Add(list.Skip(i * 5).Take(5).ToList());
        }

如果您需要性能或无法使用 linq 因为您的 .net 版本,这里有一个简单的解决方案O(n)

    private List<List<string>> SplitList(List<string> input, int size = 5)
    {
        var result = new List<List<string>>();
        for (int i = 0; i < input.Count; i++)
        {
            var partResult = new List<string>();
            while (true)
            {
                // save n items
                partResult.Add(input[i]);
                if ((i+1) % size == 0)
                {
                    break;
                }
                i++;
            }
            result.Add(partResult);
        }
        return result;
    }

您可以使用此函数:

public IEnumerable<string[]> GetChunk(string[] input, int size)
{
    int i = 0;
    while (input.Length > size * i)
    {
        yield return input.Skip(size * i).Take(size).ToArray();
        i++;
    }
}

它从列表中返回块

你可以像检查一样

var list = new[]
{
    "A", "16", "49", "FRED", "AD", "17", "17", "17", "FRED", "8", "B", "22", "22", "107", "64"
};
foreach (var strings in GetChunk(list, 5))
{
    Console.WriteLine(strings.Length); 
}