如何将一个列表<字符串>中的字符串连接到另一个列表

本文关键字:字符串 列表 连接 另一个 一个 | 更新日期: 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 更改为您的数组。