繁体   English   中英

大小未知的C#数组

[英]C# arrays with unknown size

我需要带有数组的类:

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数据类型)。

如果数组比列表快1%-我需要数组。

在知道数组的确切大小之前,您无法创建数组:与列表不同,数组不能增长* ; 一旦您给他们一个尺寸,他们将永远保持该尺寸。 如果必须要处理一个数组,请首先创建一个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调用不算作“增长”数组,因为最终会得到一个不同的数组实例,而您试图“增长”的那个实例在复制后立即被丢弃。 。

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

从性能角度来看,在您实际测试数据之前,使用List可能会很好,如果仍然有问题或瓶颈,请考虑使用Array或更有效的结构。 (除非您使用大量数据,否则运行时间应该不会有太大差异。)

(总是有将列表转换为数组的选项。)

为什么数组比列表快? 请参阅此问题以比较运行时间。

我能想到的唯一情况是数组在列表中胜出是您是否需要搜索元素,并且对数组进行了排序,因此可以进行二进制搜索。 但是,由于可以在C#中使用[]为List <T>编制索引,因此这是一个有争议的问题。

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();

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

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

然后,只要需要添加元素,就可以使用Add方法:

firstclass.Add(new FirstClass());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM