【问题标题】:Array of an unknown length in C#C#中长度未知的数组
【发布时间】:2009-03-01 06:24:02
【问题描述】:

我刚开始学习 C#,在数组的介绍中,他们展示了如何将变量建立为数组,但似乎必须在赋值时指定数组的长度,所以如果我不知道怎么办?数组的长度?

【问题讨论】:

    标签: c# arrays


    【解决方案1】:

    数组必须指定一个长度。要允许任意数量的元素,请使用 List 类。

    例如:

    List<int> myInts = new List<int>();
    myInts.Add(5);
    myInts.Add(10);
    myInts.Add(11);
    myInts.Count // = 3
    

    【讨论】:

    • List&lt;int[]&gt; myInts = new List&lt;int[]&gt;(); 可以工作。
    • 如果数组必须指定一个长度,那我为什么要这样做: String[] arr = "test;the;values;now".Split(';');它只是决定长度?但是我不能使用同一行代码,并将变量声明移到另一行。
    • @matthew_360 在 split 函数内部,实际上以固定大小调用数组。示例:referencesource.microsoft.com/#mscorlib/system/…
    • 关于您的回复"Arrays must be assigned a length" -- 在Main() 之外的static 方法中,我声明了String[] tokens = null 并没有初始化它,但我怎么能打电话给@ 987654330@ 没有得到System.NullReferenceException 错误?
    【解决方案2】:

    使用List&lt;&gt; 构建一个未知长度的“数组”。

    使用List&lt;&gt;.ToArray() 返回一个真正的数组,而不是List

    var list = new List<int>();
    list.Add(1);
    list.Add(2);
    list.Add(3);
    var array = list.ToArray();
    

    【讨论】:

    • 对我来说,List 解决了未知大小的问题,然后 .ToArray() 创建了我需要的数组。
    • 使用 System.Collections.Generic;
    【解决方案3】:

    一点背景资料:

    如前所述,如果您想要动态收集事物,请使用List&lt;T&gt;。在内部,List 也使用数组进行存储。该数组与任何其他数组一样具有固定大小。一旦数组被声明为具有大小,它就不会改变。当您将项目添加到 List 时,它会添加到数组中。最初,List 以我认为长度为 16 的数组开始。当您尝试将第 17 项添加到List 时,会发生分配一个新数组的情况,即(我认为)两次旧的大小,所以 32 项。然后将旧数组的内容复制到新数组中。因此,虽然List 在外部观察者看来可能是动态的,但在内部它也必须遵守规则。

    正如您可能已经猜到的那样,数组的复制和分配不是免费的,因此人们应该尽可能少地拥有这些,并且您可以指定(在List 的构造函数中)一个数组的初始大小,在一个完美的场景中,它刚好足够容纳你想要的一切。然而,这是微优化,它对你来说不太可能,但知道你实际在做什么总是很高兴。

    【讨论】:

    • 这正是我想要的信息。比大多数其他答案更准确且信息量更大。 +1
    【解决方案4】:

    您可以创建一个大小设置为变量的数组,即

    int size = 50;
    string[] words = new string[size]; // contains 50 strings
    

    但是,如果您决定需要 100 个字,则以后不能更改该大小。如果您需要真正动态的大小,则需要使用不同类型的数据结构。试试List

    【讨论】:

    • 这些都是空的。试试string[] words = new string(',', size - 1).Split(','); 现在它们被初始化为""
    【解决方案5】:

    如果在 .NET 1.x 中使用 ArrayList,如果在 .NET 2.0 或 3.x 中使用 List&lt;yourtype&gt;

    System.CollectionsSystem.Collections.Generics 中搜索它们。

    【讨论】:

      【解决方案6】:

      如果您的数据是唯一的,您可能还想查看字典,这将为您提供两列可供使用。

      用户名,总账单

      它为您提供了许多内置工具来搜索和更新值。

      【讨论】:

        【解决方案7】:
        var yummy = new List<string>();
        while(person.FeelsHappy()) {
            yummy.Add(person.GetNewFavoriteFood());
        }
        Console.WriteLine("Sweet! I have a list of size {0}.", list.Count);
        Console.WriteLine("I didn't even need to know how big to make it " +
            "until I finished making it!");
        

        【讨论】:

          【解决方案8】:

          尝试使用通用列表而不是数组

          【讨论】:

            【解决方案9】:

            简而言之,请使用集合和泛型。

            对于任何 C# 开发人员来说都是必须的,值得花时间学习 :)

            【讨论】:

              【解决方案10】:

              如上所述,通用 List 是最好的方法。

              如果您被困在 .NET 1.* 中,那么您将不得不改用 ArrayList 类。这没有编译时类型检查,您还必须添加强制转换 - 混乱。

              后续版本还实现了各种变体 - 包括线程安全变体。

              【讨论】:

                【解决方案11】:

                如果您确实需要使用数组而不是列表,那么您可以创建一个数组,其大小在运行时计算,如下所示...

                例如,我想要一个大小为 n × n 的二维数组。 n 将在运行时从用户那里获得

                int n = 0;
                bool isInteger = int.TryPase(Console.ReadLine(), out n);
                var x = new int[n,n];
                

                【讨论】:

                • 类似地,对于一维数组,我会写: var x = new int[n];
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2019-12-01
                • 2010-10-14
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-08-01
                相关资源
                最近更新 更多