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 .

1voto

moarboilerplate Punkte 1573

Anstatt die Eigenschaften der einzelnen Datentypen zu vergleichen, denke ich, dass die pragmatischste Antwort lautet: "Die Unterschiede sind wahrscheinlich nicht so wichtig für das, was Sie erreichen müssen, vor allem, da sie beide implementieren IEnumerable Daher sollten Sie der gängigen Konvention folgen und ein List bis Sie einen Grund haben, es nicht zu tun, und dann haben Sie wahrscheinlich Ihren Grund, ein Array statt einer List ."

Die meiste Zeit in verwaltetem Code werden Sie Sammlungen bevorzugen, die so einfach wie möglich zu handhaben sind, anstatt sich um Mikrooptimierungen zu kümmern.

1voto

iliketocode Punkte 6918

Listen in .NET sind Umhüllungen von Arrays und verwenden intern ein Array. Die zeitliche Komplexität der Operationen auf Listen ist die gleiche wie bei Arrays, jedoch gibt es ein wenig mehr Overhead mit all der zusätzlichen Funktionalität / Benutzerfreundlichkeit von Listen (wie automatische Größenänderung und die Methoden, die mit der Listenklasse kommen). Im Großen und Ganzen würde ich die Verwendung von Listen in allen Fällen empfehlen, es sei denn, es gibt einen zwingenden Grund no zu tun, z. B. wenn Sie extrem optimierten Code schreiben müssen oder mit anderem Code arbeiten, der um Arrays herum aufgebaut ist.

0voto

Sie mögen unpopulär sein, aber ich bin ein Fan von Arrays in Spielprojekten. - Iterationsgeschwindigkeit kann in einigen Fällen wichtig sein, foreach auf einem Array hat deutlich weniger Overhead, wenn Sie nicht viel pro Element tun - Hinzufügen und Entfernen ist mit Hilfsfunktionen nicht so schwer - Es ist zwar langsamer, aber in Fällen, in denen man es nur einmal erstellt, spielt es vielleicht keine Rolle. - In den meisten Fällen wird weniger zusätzlicher Speicher verschwendet (nur wirklich signifikant bei Arrays von Structs) - Etwas weniger Müll, Zeiger und Zeigerjagd

Davon abgesehen verwende ich in der Praxis viel häufiger Listen als Arrays, aber beide haben ihren Platz.

Es wäre schön, wenn List ein eingebauter Typ wäre, so dass der Wrapper- und Aufzählungs-Overhead optimiert werden könnte.

0voto

Bimal Poudel Punkte 1172

Das Auffüllen einer Liste ist einfacher als das eines Arrays. Bei Arrays müssen Sie die genaue Länge der Daten kennen, aber bei Listen kann die Datengröße beliebig sein. Außerdem können Sie eine Liste in ein Array umwandeln.

List<URLDTO> urls = new List<URLDTO>();

urls.Add(new URLDTO() {
    key = "wiki",
    url = "https://...",
});

urls.Add(new URLDTO()
{
    key = "url",
    url = "http://...",
});

urls.Add(new URLDTO()
{
    key = "dir",
    url = "https://...",
});

// convert a list into an array: URLDTO[]
return urls.ToArray();

-2voto

sajidnizami Punkte 487

Es kommt ganz darauf an, in welchem Zusammenhang die Datenstruktur benötigt wird. Wenn Sie z. B. Elemente erstellen, die von anderen Funktionen oder Diensten verwendet werden sollen, ist die Verwendung von "List" der perfekte Weg, um dies zu erreichen.

Wenn Sie nun eine Liste von Elementen haben und diese nur anzeigen wollen, z. B. auf einer Webseite, ist Array der Container, den Sie verwenden müssen.

1 Stimmen

Wenn Sie eine Liste von Elementen haben und diese nur anzeigen möchten, was ist dann falsch daran, einfach die Liste zu verwenden, die Sie bereits haben? Was würde ein Array hier bieten?

1 Stimmen

Und für das "Erstellen von Elementen, die von anderen Funktionen oder Diensten verwendet werden", würde ich einen Iteratorblock mit IEnumerable<T> - dann kann ich Objekte streamen, anstatt sie zu puffern.

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