2016-04-14 69 views
1

真的,我该怎么办? 这不起作用:如何定义具有预定义容量的列表数组?

List<object>[] myList= new List<object>[100](500); 
+0

两个答案都不错,但为什么不要你需要去做吧 ?根据定义,列表通常会增长。如果你想要一个预定义的,为什么不使用数组? – Noctis

+0

长篇故事......我试图尽量减少记忆操作,因为那是我的瓶颈。我尝试在36个内核的机器(AWS超大实例)中充分利用CPU。 – Manngo

+0

所以...你为什么不使用数组? :) – Noctis

回答

1

你可以尝试这样的事:

var array = Enumerable.Range(0,100).Select(n=>new List<object>(500)).ToArray(); 

这里我们使用List<T>构造一个参数,该列表的能力。请看看here

+0

可以工作,但是'ToArray'不知道它总是有100个元素,所以你会创建一堆基于默认*不必要的间歇性数组,一旦达到限制*启发式就启动小和两倍大小。 – MarcinJuraszek

+0

@MarcinJuraszek好赶上!我可能认为它有点快...感谢您的评论。 – Christos

+0

这解决了我的情况。非常感谢! – Manngo

1

旧风格的循环将这样的伎俩:

List<object>[] myList= new List<object>[100]; 

for(int i = 0; i < 100; i++) 
{ 
    myList[i] = new List<object>(500); 
} 
+0

谢谢!对于像我这样的人来说这是一个更容易理解的解决方案我实际上在for中用.capacity = 500尝试了同样的事情。它没有工作... – Manngo

1

你不是构建实际的名单,只是用于存储它们的引用分配空间。您只能在构建列表对象时设置容量。

你可以换另一个类的阵列和懒洋洋地构建列为他们需要:

class ListArray { 
    private readonly List<object>[] _lists; 
    private readonly int _capacity; 

    public ListArray(int size, int capacity) { 
    _lists = new List<object>[size]; 
    _capacity = capacity; 
    } 

    public List<object> this[int ix] { 
    get { 
     if(_lists[ix] == null) 
     _lists[ix] = new List<object>(capacity); 
     return _lists[ix] 
    } 
    } 
} 

然后使用它像

var myList = new ListArray(100, 500); 
    myList[0].Add(someObject);