如何在C#中创建多维数据结构?
在我看来它的作用是这样的:
List<List<int>> results = new List<List<int>>();
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
results[i][j] = 0;
}
}
这不起作用(抛出ArgumentOutOfRangeException
)。 C#中是否有多维结构允许我通过索引访问成员?
答案 0 :(得分:10)
这里的问题是List
不会自动创建元素。要初始化List<List<T>>
,您需要这样的内容:
List<List<int>> results = new List<List<int>>();
for (int i = 0; i < 10; i++)
{
results.Add(new List<int>());
for (int j = 0; j < 10; j++)
{
results[i].Add(0);
}
}
请注意,设置Capacity
是不够的,您需要拨打Add
所需的次数。或者,您可以使用Linq的Enumerable
类来简化操作:
List<List<int>> results = new List<List<int>>();
for (int i = 0; i < 10; i++)
{
results.Add(new List<int>());
results[i].AddRange(Enumerable.Repeat(0, 10));
}
再次注意Enumerable.Repeat(new List<int>(), 10)
不起作用,因为它会在同一个列表中添加10个引用。
使用Linq的另一种方法:
List<List<int>> results = Enumerable.Repeat(0, 10)
.Select(i => Enumerable.Repeat(0, 10).ToList())
.ToList();
(未使用的参数i
是必要的,以确保您不会如上所述十次引用相同的列表。)
最后,要访问元素,您可以使用之前使用的符号。添加元素后,可以按如下所示读取或修改它们:
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
results[i][j] = 2;
int x = results[i][j];
}
}
答案 1 :(得分:3)
如果您事先知道结构的尺寸,并且您不打算添加或删除元素,那么2D数组听起来就像您的那样:
int[,] n = new int[10, 20];
for (int i = 0; i < 10; ++i) {
for (int j = 0; j < 10; ++j) {
n[i, j] = ...
};
};
答案 2 :(得分:2)
您必须创建列表并使用零初始化它们,然后才能开始索引它们。
List<List<int>> results = new List<List<int>>();
for (int i = 0; i < 10; i++)
{
results.Add(new List<int>(Enumerable.Repeat(0, 10)));
}
答案 3 :(得分:2)
你必须实际上1)创建每个内部列表,并且2)将它们设置为该大小。
var Results = Enumerable.Range(0, 10).Select(i => Enumerable.Repeat(0, 10).ToList()).ToList();
但是,我有点像Linq瘾君子。
答案 4 :(得分:0)
您可以使用数据表并添加列和行吗?然后,您就可以按名称或索引引用它们。