【问题标题】:Dynamic array in C#C#中的动态数组
【发布时间】:2010-10-10 08:09:18
【问题描述】:

有什么方法可以在 C# 中创建动态数组吗?

【问题讨论】:

  • 如果你还卡在老泥巴里,用[]代替如果List,你可以用Array.Resize()。这是一个很好的例子。 dotnetperls.com/array-resize
  • 链接 dotnetperls.com/array-resize 不起作用。 (仅供参考)
  • 为什么不使用列表?

标签: c#


【解决方案1】:

看看Generic Lists

【讨论】:

  • 这个问题(虽然简短且不具描述性)不是在询问通用列表 - 问题可能是在询问 dynamic[] msdn.microsoft.com/en-GB/library/dd264736.aspx(动态类型数组)或 ExpandoObject msdn.microsoft.com/en-us/library/… I可以 -1 不提及这些的答案
  • @LukeTO'Brien,动态是在 C# 4.0 中引入的,在最初提出这个问题后整整一年才发布。 OP 可能在询问一个可调整大小的数据结构,例如 en.wikipedia.org/wiki/Dynamic_array
  • 只包含文章链接的答案是没有帮助的。无法保证该链接将保持有效。
  • @JamEngulfer 这不是真的。如果他的链接文本是“看看这个”并链接了“这个”,我会同意你的看法。如果您删除链接并查看剩下的内容,则 OP 对“查看通用列表”的回答提供了大量信息,可以让任何未来的读者在谷歌上搜索......
  • @JamEngulfer “如果你想知道为什么我现在要评论这个,那是因为我需要查找它以供参考,并且遇到了与三年前一样的烦恼”——哈;很公平。
【解决方案2】:

使用代码示例扩展 Chris 和 Migol 的答案。

使用数组

Student[] array = new Student[2];
array[0] = new Student("bob");
array[1] = new Student("joe");

使用通用列表。 List 类在底层使用数组进行存储,但这样做的方式是允许它有效地增长。

List<Student> list = new List<Student>();
list.Add(new Student("bob"));
list.Add(new Student("joe"));
Student joe = list[1];

【讨论】:

  • 这个例子有点糟糕,因为我们都谈到了 ArrayList
  • 这个答案比你的@Migol 更好,因为这显示了如何实际使用 List 而不仅仅是将其作为关键字提及。 “半坏”->“半好”->好
【解决方案3】:

有时,普通数组比通用列表更受欢迎,因为它们更方便(成本更高的计算性能更好 - 例如数值代数应用程序,或与 R 或 Matlab 等统计软件交换数据)

在这种情况下,您可以在动态启动 List 后使用 ToArray() 方法

List<string> list = new List<string>();
list.Add("one");
list.Add("two");
list.Add("three");

string[] array = list.ToArray();

当然,这只有在数组的大小永远不知道也不固定的情况下才有意义事前。 如果您已经知道数组的大小在程序的某个点,最好将它作为一个固定长度的数组启动。 (例如,如果您从 ResultSet 中检索数据,则可以计算其大小并动态启动该大小的数组)

【讨论】:

  • 不值得,只要你用的是索引器。
  • 数组并不方便(它们提供 List 接口的子集)并提供几乎相同的性能,因为 List 在下面使用常规数组。 6000000 个元素的迭代:List/for:1971ms Array/for:1864ms(基准来自stackoverflow.com/questions/454916/…
  • 如果您必须将数组传递给接口,那么它必须是一个数组。构建一个列表,然后在传递它之前将它变成一个数组要容易得多。我比其他答案更喜欢这个答案,因为它解决了这个问题!
【解决方案4】:

List&lt;T&gt; 用于强类型,或者ArrayList 如果您有 .NET 1.1 或喜欢强制转换变量。

【讨论】:

    【解决方案5】:

    动态数组示例:

    Console.WriteLine("Define Array Size? ");
    int number = Convert.ToInt32(Console.ReadLine());
    
    Console.WriteLine("Enter numbers:\n");
    int[] arr = new int[number];
    
    for (int i = 0; i < number; i++)
    {
        arr[i] = Convert.ToInt32(Console.ReadLine());
    }
    for (int i = 0; i < arr.Length; i++ )
    {
        Console.WriteLine("Array Index: "+i + " AND Array Item: " + arr[i].ToString());
    }
    Console.ReadKey();
    

    【讨论】:

      【解决方案6】:

      你可以用动态对象做到这一点:

      var dynamicKeyValueArray = new[] { new {Key = "K1", Value = 10}, new {Key = "K2", Value = 5} };
      
      foreach(var keyvalue in dynamicKeyValueArray)
      {
          Console.Log(keyvalue.Key);
          Console.Log(keyvalue.Value);
      }
      

      【讨论】:

        【解决方案7】:

        使用真正实现数组的数组列表。它最初需要大小为 4 的数组,当它变满时,会创建一个具有双倍大小的新数组,并将第一个数组的数据复制到第二个数组中,现在将新项插入到新数组中。 此外,第二个数组的名称创建了 first 的别名,以便可以通过与先前相同的名称访问它,并且第一个数组被释放

        【讨论】:

          【解决方案8】:

          您可以使用集合类中的 arraylist 对象

          using System.Collections;
          
          static void Main()
          {
            ArrayList arr = new ArrayList();
          }
          

          当你想添加你可以使用的元素时

          arr.Add();
          

          【讨论】:

            【解决方案9】:
            猜你喜欢
            • 2017-03-11
            • 2016-05-09
            • 1970-01-01
            • 1970-01-01
            • 2011-02-09
            • 2021-07-19
            • 2012-05-09
            相关资源
            最近更新 更多