如何将一个列表<字符串>中的字符串连接到另一个列表
本文关键字:字符串 列表 连接 另一个 一个 | 更新日期: 2023-09-27 18:32:26
我有List<string> Names;
,里面有70万个名字。如何连接每 500 个字符串(使用分隔符",")并将它们添加到新List<string> ABC;
所以我想要一个List<string>
,它将容纳 1400 个连接的字符串。
ABC[0]= 前 500 个名称,ABC[1]= 接下来的 500 个名称,依此类推。
以下是使用 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 个字符串连接在一起。
使用 MoreLINQ Batch(或任何其他批处理实现):
var abc = names.Batch(500).Select(x => String.Join(",", x)).ToList();
注意:分组运算符不是流式处理运算符(以及 ToList)。这意味着应枚举所有 700k 字符串,并应为每个项目计算键,并且每个项目应存储在内部组中。这将花费一些时间和资源。批处理是流式处理,它不会在内部存储所有项目。它只存储当前批次。因此,如果您不将结果转换为列表,则使用批处理可以更快地逐个处理批处理并节省一些内存。
如果不想使用单独的库,可以使用简单的扩展方法将序列划分为给定大小的子序列:
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();
此方法不会创建输入数组的副本。
最短的方法是使用 SO 答案中的 LINQ 块实现:
List<string> 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<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 更改为您的数组。