2016-04-14 70 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);