大小未知的C#数组

时间:2013-01-03 20:13:01

标签: c# .net-3.5

我需要带有数组的类:

class FirstClass
{
     int x = 0;
     int y = 0;
}

class SecondClass
{
    FirstClass[] firstclass = ???????? // size of array is unknown
    OtherClass[][] otherclass = ???????? // i need also multidimensional array or array of arrays
}

通常我正在使用List<>这样的目的,但今天我需要尽可能快的解决方案(需要处理大量数据),我认为Array应该比List更快(我读过List的地方比比Array慢很多。

问题是 - 什么投入“????????”在我的代码中?

编辑:

我的班级是一个神经网络对象。最大的数组将包含学习数据(100000多个数据行,包含50多个字段,float或double数据类型)。

如果Array比List快1% - 我需要Array。

5 个答案:

答案 0 :(得分:2)

在知道其确切大小之前,不能创建数组:与列表不同,数组不能增长 * ;一旦你给他们一个大小,他们永远保持这个大小。如果您必须有一个数组进行处理,请首先创建List<T>,填充它,然后使用ToArray()方法转换为数组:

var firstClassList = new List<FirstClass>();
firtstClassList.Add(new FirstClass(123));
firtstClassList.Add(new FirstClass(456));
FirstClass firstClass[] = firtstClassList.ToArray();

var otherClassList = new List<List<OtherClass>>();
otherClassList.Add(new List<OtherClass>());
otherClassList[0].Add(OtherClass(10));
otherClassList[0].Add(OtherClass(11));
otherClassList.Add(new List<OtherClass>());
otherClassList[1].Add(OtherClass(20));
otherClassList[1].Add(OtherClass(21));
otherClassList[1].Add(OtherClass(22));
OtherClass otherClass[][] = otherClassList.Select(r => r.ToArray()).ToArray();

但请注意,这是过早优化:列表与数组一样快,但它们提供了更大的灵活性。用数组替换列表没有意义,至少在配置文件之前是这样。

<小时/> * 调用Array.Resize来改变数组的大小并不算作“增长”数组,因为你最终会得到一个不同的数组实例,而你正试图“成长“被复制后立即被扔掉。

答案 1 :(得分:1)

如果您不确定数组的大小,您可能需要考虑使用不同类型的集合,例如您提到的List<FirstClass>或ArrayList等。

性能方面,在您实际测试数据之前,使用List可能没问题,如果仍有问题或瓶颈,请考虑使用Array或更高效的结构。 (除非您使用非常大的数据集,否则运行时间不应太大。)

(总是可以选择将列表转换为数组。)

答案 2 :(得分:1)

为什么Array会比List更快? See this question用于比较运行时间。

我能想到的唯一情况是,如果你需要搜索一个元素,那么数组会击败一个列表,并且数组已经排序,因此你可以进行二进制搜索。但是,由于您可以使用[]在C#中索引List&lt; T&gt;,这是一个有争议的问题。

答案 3 :(得分:0)

var list = new List<FirstClass>();
list.Add(object);

FirstClass[] firstClass = list.ToArray();

var listOfLists = new List<List<SecondClass>>();
var item1 = new List<SecondClass>();
item1.Add(anotherObject);
listOfLists.Add(item1);

SecondClass[][] secondClass = listsOfLists.Select(i => i.ToArray()).ToArray();

答案 4 :(得分:-5)

您可以像这样实例化它们:

FirstClass[] firstclass = new FirstClass[];
OtherClass[][] otherclass = new OtherClass[][];

然后只需在需要添加元素时使用Add方法:

firstclass.Add(new FirstClass());