gpt4 book ai didi

c# - SelectMany 在对象属性上,然后将结果保存回属性会导致 stackoverflow

转载 作者:行者123 更新时间:2023-12-05 03:56:20 24 4
gpt4 key购买 nike

我有一个简单的类,NumberCollection ,它有一个属性 Numbers类型 List<int> .

public class NumberCollection
{
public IEnumerable<int> Numbers { get; set; }
}

我创建了一个列表 NumberCollection :

var list = new List<NumberCollection>
{
new NumberCollection
{
Numbers=new List<int>{1,2,3},
},
new NumberCollection
{
Numbers=new List<int>{4,5,6},
},
};

现在我只想选择 list 的第一个元素并保存连接的 Numbers所有NumberCollections到第一个元素。我运行了这段代码:

var singleCollection = list.FirstOrDefault();
singleCollection.Numbers = list.SelectMany(c => c.Numbers);

它编译并运行良好,但试图访问 singleCollection.Numbers 的任何成员使调试器崩溃。评估singleCollection.Numbers.ElementAt(0)在即时窗口中给出了一个计算器异常。这是怎么回事?

最佳答案

您正在创建一个循环引用(因此产生了 stackoverflow)。

您正在将列表中的 第一项 分配给 singleCollection,然后尝试将第一项的编号重新分配到它自己的 Numbers 属性中。您需要通过 ToList 添加新引用,或者通过 Concat 添加值。

    var singleCollection = list.FirstOrDefault();
singleCollection.Numbers = list.SelectMany(c => c.Numbers).ToList() ;
Console.WriteLine(singleCollection.Numbers.ElementAt(0));

var singleCollection2 = list.FirstOrDefault();
singleCollection2.Numbers.Concat(list.SelectMany(c => c.Numbers));
Console.WriteLine(singleCollection2.Numbers.ElementAt(0));

编辑,您最初也可以通过使用 Select 然后创建 NumberCollection 的新实例来创建一个新的“引用”列表。

  var singleCollection3 = list.Select(x => new NumberCollection { Numbers = x.Numbers.ToList() }).FirstOrDefault();
singleCollection3.Numbers = list.SelectMany(c => c.Numbers);
Console.WriteLine(singleCollection3.Numbers.ElementAt(0));

重要提示:对于 SelectMany,您使用的是延迟执行。这意味着表达式的计算将被延迟,直到它的值被实际使用。这就是为什么 StackOverflow 在您实际尝试访问数字之前不会发生的原因。

关于c# - SelectMany 在对象属性上,然后将结果保存回属性会导致 stackoverflow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59428192/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com