【发布时间】:2009-03-01 06:24:02
【问题描述】:
我刚开始学习 C#,在数组的介绍中,他们展示了如何将变量建立为数组,但似乎必须在赋值时指定数组的长度,所以如果我不知道怎么办?数组的长度?
【问题讨论】:
我刚开始学习 C#,在数组的介绍中,他们展示了如何将变量建立为数组,但似乎必须在赋值时指定数组的长度,所以如果我不知道怎么办?数组的长度?
【问题讨论】:
数组必须指定一个长度。要允许任意数量的元素,请使用 List 类。
例如:
List<int> myInts = new List<int>();
myInts.Add(5);
myInts.Add(10);
myInts.Add(11);
myInts.Count // = 3
【讨论】:
List<int[]> myInts = new List<int[]>(); 可以工作。
"Arrays must be assigned a length" -- 在Main() 之外的static 方法中,我声明了String[] tokens = null 并没有初始化它,但我怎么能打电话给@ 987654330@ 没有得到System.NullReferenceException 错误?
使用List<> 构建一个未知长度的“数组”。
使用List<>.ToArray() 返回一个真正的数组,而不是List。
var list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
var array = list.ToArray();
【讨论】:
一点背景资料:
如前所述,如果您想要动态收集事物,请使用List<T>。在内部,List 也使用数组进行存储。该数组与任何其他数组一样具有固定大小。一旦数组被声明为具有大小,它就不会改变。当您将项目添加到 List 时,它会添加到数组中。最初,List 以我认为长度为 16 的数组开始。当您尝试将第 17 项添加到List 时,会发生分配一个新数组的情况,即(我认为)两次旧的大小,所以 32 项。然后将旧数组的内容复制到新数组中。因此,虽然List 在外部观察者看来可能是动态的,但在内部它也必须遵守规则。
正如您可能已经猜到的那样,数组的复制和分配不是免费的,因此人们应该尽可能少地拥有这些,并且您可以指定(在List 的构造函数中)一个数组的初始大小,在一个完美的场景中,它刚好足够容纳你想要的一切。然而,这是微优化,它对你来说不太可能,但知道你实际在做什么总是很高兴。
【讨论】:
您可以创建一个大小设置为变量的数组,即
int size = 50;
string[] words = new string[size]; // contains 50 strings
但是,如果您决定需要 100 个字,则以后不能更改该大小。如果您需要真正动态的大小,则需要使用不同类型的数据结构。试试List。
【讨论】:
string[] words = new string(',', size - 1).Split(','); 现在它们被初始化为""。
如果在 .NET 1.x 中使用 ArrayList,如果在 .NET 2.0 或 3.x 中使用 List<yourtype>。
在System.Collections 和System.Collections.Generics 中搜索它们。
【讨论】:
如果您的数据是唯一的,您可能还想查看字典,这将为您提供两列可供使用。
用户名,总账单
它为您提供了许多内置工具来搜索和更新值。
【讨论】:
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!");
【讨论】:
尝试使用通用列表而不是数组
【讨论】:
简而言之,请使用集合和泛型。
对于任何 C# 开发人员来说都是必须的,值得花时间学习 :)
【讨论】:
如上所述,通用 List 是最好的方法。
如果您被困在 .NET 1.* 中,那么您将不得不改用 ArrayList 类。这没有编译时类型检查,您还必须添加强制转换 - 混乱。
后续版本还实现了各种变体 - 包括线程安全变体。
【讨论】:
如果您确实需要使用数组而不是列表,那么您可以创建一个数组,其大小在运行时计算,如下所示...
例如,我想要一个大小为 n × n 的二维数组。 n 将在运行时从用户那里获得
int n = 0;
bool isInteger = int.TryPase(Console.ReadLine(), out n);
var x = new int[n,n];
【讨论】: