我可以这样做:
var o = Enumerable.Repeat((object)null, 5).ToList();
要使用List<object>
创建null
,我可以这样做:
o[0] = 5;
按预期分配值o[0] == 5
和o[1] == null
。但是,如果我这样做:
var oo = Enumerable.Repeat(Enumerable.Repeat((object)null, 5).ToList(),5).ToList();
我创建了一个2D List<List<object>>
,但如果我这样做:
var oo[0][0] = 5;
然后是oo[0][0] == 5
,还有oo[1][0] == 5
和oo[2][0] == 5
。换句话说,不是创建新的1D List<object>
并重复5次,而是重复相同的列表。考虑一下,这确实有意义。但问题是,我怎样才能让它每次创建一个新的列表?
我认为这可行:
Enumerable.Repeat(new Lazy<List<object>>(() =>
Enumerable.Repeat((object)null, colCount).ToList()).Value, rowCount).ToList();
但它仍在重复相同的值。
现在,当然,还有很多其他方法可以创建和填充带有空值的2D列表(例如嵌套循环),但我想知道是否有办法使这个工作{{1 }}
答案 0 :(得分:2)
一种解决方案是使用Range
作为外部部分:
var oo = Enumerable.Range(0,5).Select(i =>
Enumerable.Repeat((object)null,5).ToList()).ToList();
使用Range
我将迭代其他数字0...4
(5个数字),并为每个.Select
迭代生成Repeat
的新列表。因此,不是重复相同的列表5次,而是每次都生成一个新列表。
答案 1 :(得分:1)
您在逻辑上尝试做的是使用生成器函数生成对象N次,而不是重复对象N次;编写一个 :
的函数public static IEnumerable<T> Generate<T>(Func<T> generator, int count)
{
for(int i = 0; i < count; i++)
yield return generator();
}
您现在可以生成序列,例如空列表:
var list = Generate(() => new List<object>(), 5);