C#中未知长度的数组


80

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

Answers:


114

必须为数组分配一个长度。要允许任何数量的元素,请使用List类。

例如:

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

4
如果是二维的怎么办?
Subin Jacob

3
List<int[]> myInts = new List<int[]>();可以工作。
Nicolas Tyler

1
如果必须为数组指定长度,那么为什么要这样做:String [] arr =“ test; the; values; now” .Split(';'); 它只是确定长度?但是我不能使用同一行代码,而将变量声明移到另一行。
matthew_360

@ matthew_360在split函数内部,实际上以固定大小调用了该数组。示例:referencesource.microsoft.com/#mscorlib/system/…–
Hutch

关于您的响应"Arrays must be assigned a length"-在static之外的方法中Main(),我进行了声明String[] tokens = null,但没有初始化它,但是怎么能"Hello.World".Split('.')在没有System.NullReferenceException错误的情况下调用它呢?
Minh Tran

39

使用List<>建立一个未知的长度的“数组”。

使用List<>.ToArray()返回真正的数组,而不是一个List

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

对我来说,列表解决了未知大小的问题,然后.ToArray()创建了我需要的数组。
dev1998

2
使用System.Collections.Generic;
PodTech.io

17

一些背景资料:

如前所述,如果您希望动态收集事物,请使用List<T>。在内部,列表也使用数组进行存储。该数组具有固定的大小,就像其他数组一样。数组声明为具有大小后,它就不会更改。将项目添加到时List,它会添加到数组中。最初,List我以一个长度为16的数组开始。当您尝试将第17个项目添加到时List,发生的事情是分配了一个新数组,(我认为)它是旧数组的两倍。 ,所以32个项目。然后,将旧数组的内容复制到新数组中。因此,尽管aList可能对外部观察者来说是动态的,但在内部它也必须遵守规则。

就像您可能已经猜到的那样,数组的复制和分配不是免费的,因此应该以尽可能少的数组为目标,并可以指定List数组的初始大小(在的构造函数中),在理想情况下,它足以容纳所需的一切。但是,这是微优化,不太可能对您很重要,但是知道您实际在做什么总是很高兴的。


这正是我所追求的信息。比大多数其他答案更能提供更多信息。+1
嘉莉·肯德尔

16

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

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

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


这些都是空的。string[] words = new string(',', size - 1).Split(',');立即尝试使用进行初始化""
Bitterblue 2014年

3

ArrayList在.NET 1.x中使用if,List<yourtype>在.NET 2.0或3.x中使用if。

System.Collections和中搜索它们System.Collections.Generics


2

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

用户名,总账单

它为您提供了许多内置工具,可仅搜索和更新价值。


1
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!");


1

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

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


1

如上所述,通用List <>是实现此目标的最佳方法。

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

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


1

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

例如,我想要一个大小为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];
肯·扬卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.