【问题标题】:string.Join throws OutOfMemory Exceptionstring.Join 抛出 OutOfMemory 异常
【发布时间】:2024-04-23 14:45:01
【问题描述】:

我有一个字符串列表,我想在它们之间用“”(空格)加入它们,所以我使用string.Join 方法:

foreach (var line in lines)
{        
    var strings = lines.Where(l => l.Code == line.Code).Select(l => l.Data);
    var original = string.Join(" ", strings);        
}

数据看起来像这样:“123456789, 987654321, 32132, 7873892 ...”

但是我得到了 OutOfMemoryException。为什么?每个字符串大约有 100-150 个字符,列表中有 5-10 个字符串。

有没有比 string.Join 更好的方法?

【问题讨论】:

  • 程序还在做什么?这可能只是把你推到边缘的东西。
  • 肯定有其他事情发生(循环、递归等)。我们需要查看完整代码或异常堆栈跟踪。
  • 我知道这是一个愚蠢的问题,但 original 不是对 strings 中的字符串之一的引用,是吗?
  • 我的猜测:这是在 for / foreach / do 循环的中间
  • @Oded,抱歉输入错误,我删除了 +。再次,对不起

标签: c# .net string exception


【解决方案1】:

试试这个(如果您遇到同样的错误,请告诉我们):

lines.GroupBy(l => l.Code).Select(l => string.Join(" ", l.Select (x => x.Data)));

【讨论】:

    【解决方案2】:
    foreach (var line in lines.GroupBy(p=>p.Code))
    {        
        var original = string.Join(" ", line.Select(p=>p.Data));        
    }
    

    【讨论】:

      【解决方案3】:

      StringBuild() 类可以连接字符串并且不是不可变的。

      这是一篇 MSDN 文章,讨论不可变字符串与 StringBuilder 的工作原理。 http://msdn.microsoft.com/en-us/library/2839d5h5(v=vs.71).aspx

      【讨论】:

      • 我不是反对者,但我并不好奇这与 gdoron 的问题有什么关系。
      • @Raskolnikov 他问“有没有比 string.Join 更好的方法?”我的答案是 SringBuilder。 OutOfMemory 可能是由一百万个不相关的事物引起的。我的理解是 StringBuilder 是 MS 建议的连接一堆字符串的方法。我不认为我的建议完全跑题了?!
      • @JonC:(我也不是反对者)String.Join() 实际上比StringBuilder 更有效,因为它可以预先确定长度并构建精确大小的缓冲区。
      • @JonC String.Join 实际上可以比StringBuilder 更快,请参阅:*.com/questions/585860/…
      • @JamesMichaelHare 我也读过,但它总是说“在某些情况下”我不确定这是否适合 OPs 场景但说 StringBuilder 作为 string.join 的替代品我不会认为值得一票否决?