我需要带有数组的类:
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。
答案 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());