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

时间:2016-01-28 12:18:21

标签: c#

我有List<string> Names;,其中有70万个名字。如何加入每500个字符串(使用分隔符&#34;,&#34;)并将它们添加到新的List<string> ABC;

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

ABC [0] =前500个名字,ABC [1] =接下来500个名字,等等。

5 个答案:

答案 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更改为您的数组。