如何将一个List 中的字符串连接到另一个?

我有List Names; ,它有70万个名字。 如何连接每500个字符串(使用分隔符“,”)并将它们添加到新的List ABC;

所以我希望有一个List ,它将包含1400个连接的字符串。

ABC [0] =前500名,ABC [1] =接下来的500名,依此类推。

使用MoreLINQ Batch(或任何其他批处理实现 ):

 var abc = names.Batch(500).Select(x => String.Join(",", x)).ToList(); 

注意:分组运算符不是流运算符(以及ToList)。 这意味着应枚举所有700k字符串,并为每个项目计算密钥,并且每个项目应存储在内部组中。 这将花费一些时间和资源。 批处理是流式传输,它不会在内部存储所有项目。 它仅存储当前批次。 因此, 如果您不将结果转换为列表 ,则使用批处理,您可以更快地逐个处理批次并节省一些内存。

以下是如何使用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个字符串连接在一起。

如果您不想使用单独的库,则可以使用简单的扩展方法将序列分区为给定大小的子序列:

 public static class EnumerableExt { public static IEnumerable> Partition(this IEnumerable input, int blockSize) { var enumerator = input.GetEnumerator(); while (enumerator.MoveNext()) yield return nextPartition(enumerator, blockSize); } static IEnumerable nextPartition(IEnumerator 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(); 

此方法不会复制输入数组。

最简单的方法是从SO回答中使用LINQ Chunks实现:

 List ABC = Names.Select((x, i) => new { x, i }) .GroupBy(xi => xi.i / 500, xi => xi.x) .Select(g => string.Join(",", g)) .ToList(); 

像这样的东西:

 public static void Main() { string[] strs = new string[]{"aaaa","bbb","ccc","ddd","eeee","fff","ggg","hhhh","iiiii","JJJJ"}; List res=new List(); for(int i=0;i Console.WriteLine(F)); } 

只需将迭代更改为500而不是5,并将strs更改为您的数组。