【问题标题】:LINQ: How do I concatenate a list of integers into comma delimited string?LINQ:如何将整数列表连接成逗号分隔的字符串?
【发布时间】:2011-02-24 10:40:20
【问题描述】:

这可能是我错过的一些愚蠢的事情,但我尝试连接一个整数列表,而不是用它们相加:

integerArray.Aggregate((accumulator, piece) => accumulator+"," + piece)

编译器抱怨参数错误。有没有一种巧妙的方法可以做到这一点而不必通过循环?

【问题讨论】:

    标签: c# linq aggregate


    【解决方案1】:

    .NET 的哪个版本?在 4.0 中,您可以使用 string.Join(",",integerArray)。在 3.5 中,我很想只使用 string.Join(",",Array.ConvertAll(integerArray,i=>i.ToString()));(假设它 一个数组)。否则,要么将其设为数组,要么使用StringBuilder

    【讨论】:

    • 在这种情况下使用 StringBuilder 不是最好的吗?
    • 奇怪的是,Join 比 StringBuilder 的性能更高。我做了一个测试,对于一个大小为 1,000,000 的数组,Join 用了 207ms,而 StringBuilder 用了 264ms。我怀疑这是因为 Join 针对任务进行了优化,而 SB 针对一般情况进行了更多优化。
    • 如果我一开始没有Array 类型,Array.ConvertAll(list.ToArray(),...)IEnumerable.Select(...).ToArray() 之间是否存在速度差异?
    • @Michael 的关键区别在于它在找到长度时可能需要一些中间数组和块副本。但在大多数情况下,你会没事的。
    • 如果您使用足够大的初始容量创建 StringBuilder,它可能会大大加快速度。
    【解决方案2】:

    您遇到的错误是因为您没有使用 Aggregate 的覆盖来指定种子。如果不指定种子,则使用集合的类型。

    integerArray.Aggregate("", (accumulator, piece) => accumulator + "," + piece);
    

    【讨论】:

    • +1 因为你回答了这个问题。但是,您的代码具有 O(n^2) 性能。不酷。
    • @KennetBelenky, Aggregate 只不过是一个设置变量值的 foreach 循环。 - 那是 O(n) 而不是 O(n^2)?
    • @ebb 'accumulator + ...' 的运行时间与累加器中值的长度成正比。累加器字符串的长度随着每次调用而增长。该代码正在执行 n 次 O(n) 操作。这就是 O(n^2)。
    • 因为种子是“”,这将返回一个字符串,第一个值是逗号,例如,1,2,3,4 。一个解决方案是返回integerArray.First() + integerArray.Skip(1).Aggregate("", (accumulator, piece) => accumulator + "," + piece);
    • 去除多余逗号的更简单方法是 ::: integerArray.Aggregate( "",(x, y) => string.Concat(x,",", y) ).Substring(1)
    【解决方案3】:

    只是为@Marc's 添加另一个替代品

    var list = string.Join( ",", integerArray.Select( i => i.ToString() ).ToArray() );
    

    【讨论】:

      【解决方案4】:

      您可能想使用String.Join

      string.Join(",", integerArray.Select(i => i.ToString()).ToArray());
      

      如果您使用的是 .Net 4.0,则无需经历具体化数组的麻烦。并且可以做到

       string.Join(",", integerArray);
      

      【讨论】:

        猜你喜欢
        • 2016-03-13
        • 2012-12-22
        • 2012-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-29
        • 1970-01-01
        • 2015-11-14
        相关资源
        最近更新 更多