使用Enumerable.Repeat填充2D集合

时间:2015-01-15 22:02:24

标签: c#

我可以这样做:

var o = Enumerable.Repeat((object)null, 5).ToList();

要使用List<object>创建null,我可以这样做:

o[0] = 5;

按预期分配值o[0] == 5o[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] == 5oo[2][0] == 5。换句话说,不是创建新的1D List<object>并重复5次,而是重复相同的列表。考虑一下,这确实有意义。但问题是,我怎样才能让它每次创建一个新的列表?

我认为这可行:

Enumerable.Repeat(new Lazy<List<object>>(() => 
    Enumerable.Repeat((object)null, colCount).ToList()).Value, rowCount).ToList();

但它仍在重复相同的值。

现在,当然,还有很多其他方法可以创建和填充带有空值的2D列表(例如嵌套循环),但我想知道是否有办法使这个工作{{1 }}

2 个答案:

答案 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);