从列表中获取 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) 来完成......
您可以使用整数除法技巧:
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);
}