749 Stimmen

Array versus Liste<T>: Wann ist was zu verwenden?

MyClass[] array;
List<MyClass> list;

Welche Szenarien gibt es, in denen das eine dem anderen vorzuziehen ist? Und warum?

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 .

5voto

smack0007 Punkte 10526

Wenn ich genau weiß, wie viele Elemente ich brauchen werde, sagen wir, ich brauche 5 Elemente und nur immer 5 Elemente, dann verwende ich ein Array. Ansonsten verwende ich einfach eine List<T>.

1 Stimmen

Warum sollten Sie nicht eine List<T> verwenden, wenn Sie die Anzahl der Elemente kennen?

5voto

Christian Findlay Punkte 5653

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.

2 Stimmen

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

3voto

Sune Rievers Punkte 2486

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.

1 Stimmen

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.

1 Stimmen

@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.

2voto

snipsnipsnip Punkte 1931

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:

1 Stimmen

"In C# ist ein Array eine Liste" Das ist nicht wahr; ein Array ist keine List implementiert es nur die IList Schnittstelle.

1voto

supercat Punkte 72939

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> .

1 Stimmen

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.

0 Stimmen

@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.

0 Stimmen

Gute Nachrichten. Es funktioniert. list[0].X += 3; fügt der Eigenschaft X des ersten Elements der Liste 3 hinzu. Und list ist eine List<Point> y Point ist eine Klasse mit X- und Y-Eigenschaften

CodeJaeger.com

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.

Powered by:

X