在C#中声明一个二维数组但不知道其大小

5

我想使用一个二维数组,但是我事先不知道它的大小。所以我的问题是:如何声明它?然后如何向其添加值?

String[,] tabConfig = new String[?, 4];
foreach(blabla with i)
{
    tabConfig[i, 0] = a;
    tabConfig[i, 1] = b;
    tabConfig[i, 2] = c;
    tabConfig[i, 3] = d;
}

我知道我也可以使用列表,但我对它不是很熟悉。

谢谢!

编辑:准备好了!这是我真正的代码,得到了Jon Skeet的帮助!

List<string[]> tabConfig = new List<string[]>();
String[] temp = new String[4];//The array that will be inside the List
int line = 0, column = 0;

foreach (XmlNode e in doc.DocumentElement.ChildNodes)
{
    if (e.Attributes["Server"].Value == choice)
    {
        temp[0] = e.Attributes["Serveur"].Value;//Here is value 'a'

        column = 1;
        foreach (XmlNode i in e.ChildNodes)
        {
            temp[colonne] = i.InnerText;//Here are values 'b', 'c' and 'd'
            column++;
        }
        tabConfig.Add(temp);//Put a new line into the List
        line++;
    }
}

然后进行调用:

foreach(string[] array in tabConfig)
    foreach(String txt in array)
        Console.WriteLine(txt);

2
你不能在循环中计算你正在迭代的任何内容吗? - JMK
3
如果需要动态大小,可以使用列表的列表(或者是一个列表的数组,每个元素又是一个数组,如果你知道其中一个维度)。List<List<string>> - Matt Burland
所以你的意思是我可以这样做 for(blabla i){ count++; } String[,] tabConfig = new String[count, 4]; 然后我的foreach(blabla i){}吗? 我觉得这并不是很划算。我相信有更加动态的解决方案。 - Sphax
我想为列表说几句话...它们是非常棒的东西... - user1725145
7个回答

14
所以我的问题是:如何声明它?
你无法这样做。在.NET中,所有的数组都是固定大小的:如果不知道大小就无法创建一个数组实例。
看起来你应该使用一个 List<T>,我建议创建一个类来保存这四个属性,而不仅仅是使用一个数组的四个元素。你也可以使用数组的列表。
List<string[]> tabConfig = new List<string[]>();
foreach (...)
{
    tabConfig.Add(new string[] { a, b, c, d });
}

...但是你需要知道这四个元素在排序方面的含义,这可能会使你的其余代码更难理解。


3
您可以使用一个
List<List<string>> 

对于这个,你不想要吗?

2
您最好使用类似字典的工具来查找单词,比如说:
IDictionary<string, IList<TYPE>> myContainer = new Dictionary<string, List<TYPE>>();
myContainer.Add("key1", new List<TYPE>());
myContainer["key1"].Add("SomeTYPE-1");
myContainer["key1"].Add("SomeTYPE-2");
myContainer["key1"].Add("SomeTYPE-3");

myContainer.Add("key2", new List<TYPE>());
myContainer["key2"].Add("A");
myContainer["key2"].Add("B");
myContainer["key2"].Add("C");

更新 正如@jon所评论的,如果你想通过某种形式的键来访问2d数组的元素,则可以使用字典,这可能会/可能不会对你的情况有用。如果你不想要基于键的字典,则应该按照@jon发布的内容继续操作。


4
这里没有明显的迹象表明需要使用字典。没有明显的键,而数组可以保持顺序,而字典不能。 - Jon Skeet
Jon Skeet是正确的:我需要保持顺序。而且实际上我的a,b,c,d变量已经是字典了。所以它将会是字典的字典的列表的数组... 我相信C#语言可以做得更好 :) - Sphax

1

解决方法:

private struct MyStruct
{
    int x;
    int y;
}

List<MyStruct> myList = new List<MyStruct>(); 

1
制作一个类似这样的类:
public class MyClass
{
public string one{get;set;}
public string two{get;set;}
}

现在,您可以像这样列出此对象的列表:
List<MyClass> list1=new List<MyClass>();

1

1
如果我是你,我会将数组大小设为你正在迭代的列表的长度,因为数组必须声明为固定大小。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接