C#中未知长度的数组

时间:2009-03-01 06:24:03

标签: c# arrays

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

11 个答案:

答案 0 :(得分:103)

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

例如:

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

答案 1 :(得分:36)

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

使用List<>.ToArray()返回真实数组,而不是List

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

答案 2 :(得分:14)

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

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

但是,如果你决定需要100个单词,那么这个大小以后就无法改变。如果您需要大小非常动态,则需要使用不同类型的数据结构。试试List

答案 3 :(得分:14)

一些背景信息:

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

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

答案 4 :(得分:3)

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

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

答案 5 :(得分:2)

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

用户名,总帐单

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

答案 6 :(得分: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!");

答案 7 :(得分:1)

尝试通用列表而不是数组

答案 8 :(得分:1)

简而言之,请使用Collections and Generics。

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

答案 9 :(得分:1)

如上所述,通用列表&lt;&gt;是最好的方式。

如果您遇到.NET 1. *,那么您将不得不使用ArrayList类。这没有编译时类型检查,你还必须添加cast - messy。

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

答案 10 :(得分:1)

如果确实需要使用数组而不是列表,则可以创建一个数组,其大小在运行时像这样...

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

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