我有List<string> Names;
,其中有70万个名字。如何加入每500个字符串(使用分隔符&#34;,&#34;)并将它们添加到新的List<string> ABC;
所以我希望有一个List<string>
,它将包含1400个连接的字符串。
ABC [0] =前500个名字,ABC [1] =接下来500个名字,等等。
答案 0 :(得分:8)
以下是使用LINQ的方法:
var result =
Names
.Select((item, index) => new {Item = item, Index = index})
.GroupBy(x => x.Index / 500)
.Select(g => string.Join(",", g.Select(x => x.Item)))
.ToList();
首先,对于每个项目,您选择它自己的项目及其索引。然后,您按index / 500
对这些项目进行分组,这意味着每500个项目将组合在一起。
然后使用string.Join
将每个组中的500个字符串连接在一起。
答案 1 :(得分:7)
使用MoreLINQ批量(或any other batch implementation):
\b
注意:分组运算符不是streaming运算符(以及ToList)。这意味着应枚举所有700k字符串,并为每个项目计算密钥,并且每个项目应存储在内部组中。这将花费一些时间和资源。批处理是流式传输,它不会在内部存储所有项目。它仅存储当前批次。因此,如果您不将结果转换为列表,则批量,您可以更快地逐个处理批次并节省一些内存。
答案 2 :(得分:4)
如果您不想使用单独的库,可以使用简单的扩展方法将序列划分为给定大小的子序列:
public static class EnumerableExt
{
public static IEnumerable<IEnumerable<T>> Partition<T>(this IEnumerable<T> input, int blockSize)
{
var enumerator = input.GetEnumerator();
while (enumerator.MoveNext())
yield return nextPartition(enumerator, blockSize);
}
static IEnumerable<T> nextPartition<T>(IEnumerator<T> enumerator, int blockSize)
{
do yield return enumerator.Current;
while (--blockSize > 0 && enumerator.MoveNext());
}
}
然后你可以像这样使用它:
// Create some sample strings.
var strings = Enumerable.Range(1, 10000).Select(x => x.ToString()).ToList();
var result = strings.Partition(500).Select(block => string.Join(",", block)).ToList();
此方法不会复制输入数组。
答案 3 :(得分:0)
最短的方法是使用LINQ Chunks实现from SO answer:
List<string> ABC = Names.Select((x, i) => new { x, i })
.GroupBy(xi => xi.i / 500, xi => xi.x)
.Select(g => string.Join(",", g))
.ToList();
答案 4 :(得分:0)
类似的东西:
public static void Main()
{
string[] strs = new string[]{"aaaa","bbb","ccc","ddd","eeee","fff","ggg","hhhh","iiiii","JJJJ"};
List<string> res=new List<string>();
for(int i=0;i<strs.Length;i+=5){
res.Add(string.Join(",",strs,i,5));
}
res.ForEach(F => Console.WriteLine(F));
}
只需将迭代更改为500而不是5,并将strs更改为您的数组。