2016-04-14 8 views
1

Wirklich, wie kann ich es tun? Dies funktioniert nicht:Wie definiere ich ein Array von Listen mit vordefinierter Kapazität?

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

beide Antworten sind gut, aber warum don Sie brauchen es zu tun ? Eine Liste per Definition ist etwas, das normalerweise wächst. Wenn Sie eine vordefinierte verwenden möchten, warum nicht ein Array verwenden? – Noctis

+0

Lange Geschichte ... Ich versuche Speichervorgänge absolut zu minimieren, da das mein Engpass ist. Ich versuche, CPUs in einer Maschine mit 36 ​​Kernen (AWS extra large instance) vollständig zu nutzen. – Manngo

+0

also ... warum benutzt du keine Arrays ?? :) – Noctis

Antwort

1

Sie könnten so etwas wie dies versuchen:

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

Hier verwenden wir den List<T> Konstruktor mit einem Argument, die Fähigkeit der Liste. Bitte werfen Sie einen Blick auf here.

+0

Funktioniert, aber 'ToArray' weiß nicht, dass es immer 100 Elemente haben wird, so erstellen Sie eine Reihe von unnötigen intermittierenden Arrays basierend auf Standard * Start klein und das Doppelte der Größe einmal erreicht * Heuristiken. – MarcinJuraszek

+0

@MarcinJuraszek guten Fang! Ich dachte vielleicht ein bisschen schnell ... Danke für deinen Kommentar. – Christos

+0

Das hat meinen Fall gelöst. Danke vielmals! – Manngo

1

Old style Schleife wird der Trick:

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

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

Danke! Dies ist eine verständlichere Lösung für jemanden wie mich. Ich probierte das Gleiche mit .capacity = 500 im for. Es hat nicht funktioniert ... – Manngo

1

Sie sind nicht die tatsächlichen Listen konstruieren, nur Raum Zuteilung für Verweise auf sie zu speichern. Sie können die Kapazität nur beim Erstellen der Listenobjekte festlegen.

Sie könnten das Array in einer anderen Klasse wickeln und die Listen lazily konstruieren, wie sie benötigt werden:

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] 
    } 
    } 
} 

dann verwenden, wie

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