2009-03-12 6 views
2

Ich habe Code, der Arrays verwendet, und leider kann ich ihre Typen nicht ändern. Wenn ich könnte, würde ich ArrayLists oder etwas Ähnliches verwenden, um zu tun, was ich tun muss, aber ich kann nicht. Im Grunde suche ich nach dem besten Ansatz zum Hinzufügen und Entfernen von Objekten aus einem statischen Array. Um ein Element im laufenden Betrieb zum Array hinzuzufügen, muss ich ein neues Array erstellen, das ein Element größer als das alte Array ist, die Elemente aus dem alten Array in das neue Array kopieren und das neue Element hinzufügen. etwas wie das ...gibt es eine Möglichkeit, ein statisches C# -Array wie eine ArrayList zu behandeln?

zum Löschen eines Elements, ich mache das gleiche, nur ich erstelle ein neues Array, das ein Element kleiner ist. das fühlt sich wirklich ineffizient an. Kann jemand einen besseren Ansatz vorschlagen, wenn es einen gibt? oder irgendwelche anderen Gedanken?

danke im voraus für alle ihre hilfe!

+0

Seit .NET 2.0 können Sie anstelle eines Arrays die Liste verwenden. – mmmmmmmm

Antwort

3

Warum möchten Sie hier ein Array verwenden? Wechseln Sie zu List<T>, oder (wenn Sie effiziente Entfernungen/Einfügungen von der Mitte benötigen) a LinkedList<T>.

Ich bin mir nicht sicher, ob Sie "statisch" meinen, wie ich es meine - können Sie das klären?

Für Informationen können Sie Array.Resize(ref myArray, newSize) verwenden, aber das ist nicht die richtige Antwort für häufige Änderungen.

+0

Um dies zu erweitern, da er jetzt beschwert ist, dass er nicht kann, hat die List Klasse eine ToArray() -Methode, die Sie aufrufen können, wann immer Sie eine API benötigen, die ein Array benötigt. –

+0

Da hat er jetzt "erklärt", dass er nicht kann. = P – DevinB

6

Nein - Arrays haben immer eine feste Größe. Sie können keine Einträge hinzufügen/löschen.

Dies ist genau die Einschränkung, ArrayList und List<T> arbeiten effektiv. Sie verwalten intern ein Array, aber das ist normalerweise größer als die logische Größe der Liste. Wenn Sie ein Element zu einem List<T> hinzufügen, füllt es das vorhandene Array, wenn es möglich ist, oder wenn nicht genügend Platz vorhanden ist, erstellt es ein neues, größeres Array und kopiert den Inhalt hinein. Diese Änderung ist jedoch für den Aufrufer transparent - Sie können immer noch den ursprünglichen Verweis verwenden, da es sich um einen Verweis auf die Liste und nicht auf das zugrunde liegende Array handelt.

Eine Sache, die Ihren Code einfacher macht (aber wahrscheinlich nicht effizienter) ist Array.Resize zu verwenden. Es ändert nicht die Größe vorhandenen Array, aber gibt ein neues Array mit einer flachen Kopie des alten Inhalts, in der Größe, die Sie anfordern. Das Kopieren kann ein wenig schneller sein als bei einer manuellen Schleife, aber der Hauptgrund für die Ineffizienz ist immer noch da.

0

Sie schreiben im Grunde Ihre eigene Liste, aber auf eine weniger effiziente Art und Weise.

Liste ist intern, was Sie beschreiben, aber mit einem großen Unterschied in Bezug auf die Leistung.

Wenn es sein internes Array neu zuordnet, fügt es nicht nur ein neues Element hinzu, es fügt einen Block von ihnen hinzu. Auf diese Weise erfordern zukünftige Ergänzungen nicht immer eine Neuzuweisung. Dies ist die "Kapazität" der Liste - und warum die Listenkapazität immer> = die Listengröße ist.

Wenn Sie dies tun müssen, würde ich empfehlen, etwas ähnliches zu tun. Der Wechsel zu List wäre jedoch eine viel bessere Option.

0

Alles, was Sie tun können, um ein Array mehr wie ein ArrayList oder List<T> zu machen, wird nur dazu führen, dass Sie am Ende wieder Teil (oder alle) dieser Klassen implementieren. Ihr bestes ist, die eingebauten Klassen zu verwenden, wie die anderen Antworten angegeben haben.

2

Von den Geräuschen davon können Sie die Datenstruktur nicht ändern, also müssen Sie sich mit Arrays beschäftigen.

Das einzige, was Sie wirklich helfen bekommen kann, ist, dass Sie die Schleife vermeiden und eine Array.Copy tun

int oldLength = dataStruct.myStaticArray.Length; 
myObject[] newMyObjectArray = new myObject[oldLength + 1]; 
Array.copy(dataStruct.myStaticArray, newMyObjectArray, oldLength); 

dataStruct.myStaticArray[oldLength] = new myObject(); 
dataStruct.myStaticArray = newMyObjectArray; 

EDIT Eigentlich könnte diese Arbeit:

int oldLength = dataStruct.myStaticArray.Length; 
Array.Resize(dataStruct.myStaticArray, oldLength+1); 
+0

Nur FYI - Array.Copy ist eigentlich oft langsamer als die Schleife. In diesem Fall wird intern auf jeder Kopie Boxing/Unboxing ausgeführt, da Sie Ints kopieren. Dies war einer der Vorteile von .net2 und Generika. –

3

leider Ich kann ihre Typen nicht ändern

Warum nicht? Die einzige vernünftige Antwort ist, dass Sie eine API haben, die Sie mit Funktionen verwenden müssen, die sie zurückgeben oder als Parameter benötigen. Verwenden Sie in diesem Fall List<T> und rufen Sie die Methoden .ToArray() oder nach Bedarf auf.

Verwandte Themen