如果多次调用,Concat会导致堆栈溢出

wis*_*ter 1 .net c# linq stack-overflow concatenation

应用程序意外崩溃,堆栈溢出错误.经过研究,我发现崩溃的原因是遵循以下代码:

foreach (var item in items)
{
    result = result.Concat(item.Data);
}
Run Code Online (Sandbox Code Playgroud)

这是多个IEnumerables的连接.应用程序在items包含10,000个元素时崩溃.

SelectMany解决了这个问题.但还是......

为什么Concat扩展导致堆栈溢出?

D S*_*ley 8

请记住,结果Concat不是集合 - 它是一个查询.

所以你的"结果"是有效的

Enumerable.Concat(item10000.Data, 
                  Enumerable.Concat(item9999.Data, 
                                  ....
                                    Enumerable.Concat(item2.Data, 
                                                      item1.Data))));
Run Code Online (Sandbox Code Playgroud)

生成嵌套查询时,会导致堆栈溢出.

另一种选择是创建一个列表并每次添加它:

var list = new List<something>();
foreach (var item in items)
{
    list.AddRange(item.Data);
}
Run Code Online (Sandbox Code Playgroud)

这基本上是SelectMany做什么的(但是使用延迟的枚举器,而不是a List):

result = items.SelectMany(item => item.Data);
Run Code Online (Sandbox Code Playgroud)