MyClass[] array;
List<MyClass> list;
Welche Szenarien gibt es, in denen das eine dem anderen vorzuziehen ist? Und warum?
MyClass[] array;
List<MyClass> list;
Welche Szenarien gibt es, in denen das eine dem anderen vorzuziehen ist? Und warum?
Arrays vs. Listen ist ein klassisches Problem zwischen Wartbarkeit und Leistung. Die Faustregel, die fast alle Entwickler befolgen, lautet, dass man beides anstreben sollte, aber wenn es zu einem Konflikt kommt, sollte man die Wartbarkeit der Leistung vorziehen. Die Ausnahme von dieser Regel ist, wenn sich die Leistung bereits als Problem erwiesen hat. Wenn Sie dieses Prinzip auf Arrays vs. Listen übertragen, erhalten Sie folgendes Ergebnis:
Verwenden Sie stark typisierte Listen, bis Sie auf Leistungsprobleme stoßen. Wenn Sie auf ein Leistungsproblem stoßen, sollten Sie entscheiden, ob der Verzicht auf Arrays Ihrer Lösung in Bezug auf die Leistung mehr nützt, als dass er ihr in Bezug auf die Wartung schadet.
Das bringt uns zu der wichtigsten geschäftlichen Entscheidung, die wir treffen müssen: Zeit ist Geld. Arrays kosten in der Regel mehr Zeit für Entwicklung und Wartung, insbesondere mehrdimensionale Arrays, als Listen oder Sammlungen von Objekten. Aber sie kommen mit einem Preis von geringfügigen Leistungs- und Speichereinbußen in vielen Fällen
In den meisten Fällen ist die Verwendung einer List
würde ausreichen. A List
verwendet ein internes Array, um seine Daten zu verwalten, und passt die Größe des Arrays automatisch an, wenn weitere Elemente zu der List
als seine aktuelle Kapazität, was die Nutzung einfacher macht als bei einem Array, bei dem man die Kapazität vorher kennen muss.
Siehe http://msdn.microsoft.com/en-us/library/ms379570(v=vs.80).aspx#Datenstrukturen20_1_topic5 für weitere Informationen über Listen in C# oder einfach dekompilieren System.Collections.Generic.List<T>
.
Wenn Sie mehrdimensionale Daten benötigen (z. B. bei Verwendung einer Matrix oder in der Grafikprogrammierung), würden Sie wahrscheinlich eine array
stattdessen.
Wie immer gilt: Wenn Speicher oder Leistung ein Problem sind, messen Sie sie! Sonst könnten Sie falsche Annahmen über den Code machen.
Hallo, könnten Sie erklären, warum "Die Nachschlagezeit einer Liste wäre O(n)" wahr ist? Soweit ich weiß, verwendet List<T> Array hinter den Kulissen.
@dragonfly du hast völlig recht. Quelle . Damals nahm ich an, dass die Implementierung Zeiger verwendet, aber inzwischen habe ich etwas anderes erfahren. Aus dem obigen Link: "Das Abrufen des Wertes dieser Eigenschaft ist eine O(1)-Operation; das Setzen der Eigenschaft ist ebenfalls eine O(1)-Operation.
Da es niemand erwähnt hat: In C#, ein Array ist eine Liste. MyClass[]
y List<MyClass>
beide implementieren IList<MyClass>
. (z.B.. void Foo(IList<int> foo)
kann aufgerufen werden wie Foo(new[] { 1, 2, 3 })
o Foo(new List<int> { 1, 2, 3 })
)
Wenn Sie also eine Methode schreiben, die eine List<MyClass>
als Argument angeben, aber nur eine Teilmenge der Merkmale verwenden, sollten Sie als IList<MyClass>
stattdessen für die Bequemlichkeit der Anrufer.
Einzelheiten:
Eine andere, noch nicht erwähnte Situation ist die, dass man eine große Anzahl von Elementen hat, von denen jedes aus einem festen Bündel verwandter, aber unabhängiger Variablen besteht (z. B. die Koordinaten eines Punktes oder die Eckpunkte eines 3D-Dreiecks). Ein Array aus Strukturen mit exponierten Feldern ermöglicht eine effiziente Änderung der Elemente "an Ort und Stelle" - etwas, das mit keinem anderen Sammlungstyp möglich ist. Da ein Array von Strukturen seine Elemente fortlaufend im RAM speichert, können sequenzielle Zugriffe auf Array-Elemente sehr schnell sein. In Situationen, in denen Code viele sequentielle Durchläufe durch ein Array machen muss, kann ein Array von Strukturen ein Array oder eine andere Sammlung von Klassenobjektreferenzen um den Faktor 2:1 übertreffen; darüber hinaus kann die Fähigkeit, Elemente an Ort und Stelle zu aktualisieren, einem Array von Strukturen erlauben, jede andere Art von Struktursammlung zu übertreffen.
Obwohl die Größe von Arrays nicht geändert werden kann, ist es nicht schwierig, einen Code zu schreiben, der eine Array-Referenz zusammen mit der Anzahl der verwendeten Elemente speichert und das Array bei Bedarf durch ein größeres ersetzt. Alternativ könnte man einfach Code für einen Typ schreiben, der sich ähnlich verhält wie ein List<T>
aber seinen Hintergrundspeicher freigelegt, so dass man sagen kann, entweder MyPoints.Add(nextPoint);
o MyPoints.Items[23].X += 5;
. Beachten Sie, dass letzteres nicht notwendigerweise eine Ausnahme auslöst, wenn der Code versucht, über das Ende der Liste hinaus zuzugreifen, aber die Verwendung wäre ansonsten konzeptionell sehr ähnlich zu List<T>
.
Was Sie beschrieben haben, ist eine List<>. Es gibt einen Indexer, so dass Sie direkt auf das zugrunde liegende Array zugreifen können, und die List<> wird die Größe für Sie beibehalten.
@Carl: Gegeben z.B.. Point[] arr;
ist es möglich, dass der Code z. B. sagt arr[3].x+=q;
. Mit z.B. List<Point> list
müsste es stattdessen heißen Point temp=list[3]; temp.x+=q; list[3]=temp;
. Es wäre hilfreich, wenn List<T>
hatte eine Methode Update<TP>(int index, ActionByRefRef<T,TP> proc, ref TP params)
. und Compiler könnten sich list[3].x+=q;
in {list.Update(3, (ref int value, ref int param)=>value+=param, ref q);
aber eine solche Funktion gibt es nicht.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
13 Stimmen
Arrays sind eher veraltet, wie in einem beliebte Diskussion hier. Auch hier hervorgehoben und von unserem Gastgeber im Blog .
11 Stimmen
Wenn ich mich nicht irre, hat die List<> ein Array als interne Struktur. Immer wenn das interne Array gefüllt ist, wird der Inhalt einfach in ein Array kopiert, das doppelt so groß ist (oder eine andere Konstante, die die aktuelle Größe angibt). de.wikipedia.org/wiki/Dynamische_Anordnung
0 Stimmen
Ykok: Was du sagst, scheint zu stimmen, ich habe den Quellcode von Liste<> hier .
42 Stimmen
@gimel Die Behauptung, dass Arrays veraltet sind, ist vielleicht ein wenig gewagt