158 Stimmen

Neues Element in bestehendes Array in c#.net hinzufügen

Wie man neues Element in bestehenden String-Array in C#.net hinzufügen?

Ich muss die vorhandenen Daten erhalten.

128voto

Ed S. Punkte 118985

Ich würde eine Liste verwenden, wenn Sie ein dynamisch dimensioniertes Array benötigen:

List<string> ls = new List<string>();
ls.Add("Hello");

115voto

Ali Ersöz Punkte 15342

Das könnte eine Lösung sein;

Array.Resize(ref array, newsize);
array[newsize - 1] = "newvalue"

Aber für dynamische Größe Array würde ich bevorzugen Liste zu.

55voto

Stephen Chung Punkte 14323

LINQ verwenden:

arr = (arr ?? Enumerable.Empty<string>()).Concat(new[] { newitem }).ToArray();

Ich verwende dies gerne, da es ein Einzeiler ist und sich sehr gut in eine switch-Anweisung oder eine einfache if-Anweisung einbetten oder als Argument übergeben lässt.

EDIT:

Manche Leute mögen keine new[] { newitem } weil es ein kleines, temporäres Array mit nur einem Element erstellt. Hier ist eine Version mit Enumerable.Repeat die keine Erstellung eines Objekts erfordert (zumindest nicht an der Oberfläche - .NET-Iteratoren erstellen wahrscheinlich eine Reihe von Zustandsmaschinenobjekten unter dem Tisch).

arr = (arr ?? Enumerable.Empty<string>()).Concat(Enumerable.Repeat(newitem,1)).ToArray();

Und wenn Sie sicher sind, dass das Feld niemals null zu beginnen, können Sie es vereinfachen zu:

arr.Concat(Enumerable.Repeat(newitem,1)).ToArray();

Beachten Sie, dass Sie einer geordneten Sammlung Elemente hinzufügen können, List ist wahrscheinlich die gewünschte Datenstruktur und nicht ein Array, mit dem Sie beginnen.

37voto

Grimace of Despair Punkte 3297

Eine sehr alte Frage, aber ich wollte sie trotzdem stellen.

Wenn Sie nach einem Einzeiler suchen, können Sie den unten stehenden Code verwenden. Er kombiniert den Listenkonstruktor, der eine Aufzählung akzeptiert, mit der Syntax des Initialisierers "new" (da Frage aufgeworfen).

myArray = new List<string>(myArray) { "add this" }.ToArray();

31voto

artur02 Punkte 4401

Arrays in C# sind unveränderlich z.B. string[] , int[] . Das bedeutet, dass Sie die Größe nicht ändern können. Sie müssen ein völlig neues Array erstellen.

Hier ist der Code für Array.Resize :

public static void Resize<T>(ref T[] array, int newSize)
{
    if (newSize < 0)
    {
        throw new ArgumentOutOfRangeException("newSize", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
    }
    T[] sourceArray = array;
    if (sourceArray == null)
    {
        array = new T[newSize];
    }
    else if (sourceArray.Length != newSize)
    {
        T[] destinationArray = new T[newSize];
        Copy(sourceArray, 0, destinationArray, 0, (sourceArray.Length > newSize) ? newSize : sourceArray.Length);
        array = destinationArray;
    }
}

Wie Sie sehen können, wird ein neues Array mit der neuen Größe erstellt, der Inhalt des Quell-Arrays kopiert und der Verweis auf das neue Array gesetzt. Der Hinweis hierfür ist die ref Schlüsselwort für den ersten Parameter.

Es gibt Listen, die neue Slots dynamisch zuweisen für neue Artikel. Dies ist z. B. Liste<T> . Diese enthalten unveränderliche Arrays und ändern ihre Größe bei Bedarf (List<T> ist keine Implementierung einer verketteten Liste!). ArrayList ist das Gleiche ohne Generics (mit Objekt Array).

LinkedList<T> ist eine echte Implementierung einer verknüpften Liste. Leider kann man der Liste nur LinkListNode<T> Elemente hinzufügen, so dass man seine eigenen Listenelemente in diesen Knotentyp einpacken muss. Ich denke, seine Verwendung ist unüblich.

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