【问题标题】:Declaring a 2D array without knowing its size in C#在 C# 中不知道其大小的情况下声明二维数组
【发布时间】:2013-12-11 14:08:40
【问题描述】:

我想使用二维数组,但我无法提前知道它的大小。所以我的问题是:如何声明它?那么如何给它加值呢?

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

【问题讨论】:

  • 你不能计算你在循环中迭代的任何东西吗?
  • 如果您需要动态调整大小,请改用列表列表(如果您知道一维,则使用列表列表的数组)。 List&lt;List&lt;string&gt;&gt;.
  • 所以你说我可以为(blabla i){ count++; } String[,] tabConfig = new String[count, 4];然后是我的 foreach(blabla i){} ?我不觉得它真的有利可图。我确信有一个更动态的解决方案。
  • 我想用一个词来形容列表...它们是非常棒的东西...

标签: c# arrays multidimensional-array


【解决方案1】:

所以我的问题是:如何声明它?

你不能。 .NET 中的所有数组都是固定大小的:您无法在不知道大小的情况下创建数组实例。

在我看来,您应该有一个List&lt;T&gt; - 实际上我会创建一个类来保存四个属性,而不是仅仅使用数组的四个元素,可能。您可以使用数组列表:

List<string[]> tabConfig = new List<string[]>();
foreach (...)
{
    tabConfig.Add(new string[] { a, b, c, d });
}

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

【讨论】:

    【解决方案2】:

    你可以用一个

    List<List<string>> 
    

    为了这个,不是吗?

    【讨论】:

      【解决方案3】:

      您可能最好使用类似的字典

      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 所评论的,如果您想通过某种形式的键访问二维数组的元素,您可以使用字典,这在您的情况下可能/可能没有用。如果您不想要基于键的字典,请坚持使用 @jon 发布的内容。

      【讨论】:

      • 这里没有迹象表明字典是合适的。没有明显的键,数组保留顺序,而字典则没有。
      • Jon Skeet 是对的:我需要保持秩序。实际上我的 a,b,c,d 变量已经是字典了。所以它会去数组列表字典的字典......我相信C#语言可以做得更好:)
      【解决方案4】:

      如果你能做一个foreach,你就能知道它的大小。如果您知道大小,则可以创建具有必要大小的射线。

      但我会为它使用一个列表。对于这种情况更友好。

      http://www.functionx.com/csharp/builtinclasses/list.htm

      【讨论】:

        【解决方案5】:

        解决方法:

        private struct MyStruct
        {
            int x;
            int y;
        }
        
        List<MyStruct> myList = new List<MyStruct>(); 
        

        【讨论】:

          【解决方案6】:

          创建一个这样的类

          public class MyClass
          {
          public string one{get;set;}
          public string two{get;set;}
          }
          

          现在你可以列出这个对象了

          List<MyClass> list1=new List<MyClass>();
          

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-03-09
              • 2018-03-26
              • 2016-10-13
              • 2019-04-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-12-27
              相关资源
              最近更新 更多