如何将一个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更改为您的数组。