Wie füge ich ein neues Element in ein vorhandenes String-Array in C # .net ein?
Ich muss die vorhandenen Daten beibehalten.
Ich würde eine Liste verwenden, wenn Sie ein Array mit dynamischer Größe benötigen:
List<string> ls = new List<string>();
ls.Add("Hello");
Das könnte eine Lösung sein;
Aber für ein Array mit dynamischer Größe würde ich auch eine Liste bevorzugen.
quelle
Verwenden von LINQ:
Ich verwende dies gerne, da es ein Einzeiler ist und sehr praktisch ist, um es in eine switch-Anweisung, eine einfache if-Anweisung oder eine Übergabe als Argument einzubetten.
BEARBEITEN:
Einige Leute mögen es nicht,
new[] { newitem }
weil es ein kleines temporäres Array mit einem Element erstellt. Hier ist eine VersionEnumerable.Repeat
, bei der kein Objekt erstellt werden muss (zumindest nicht auf der Oberfläche - .NET-Iteratoren erstellen wahrscheinlich eine Reihe von Zustandsmaschinenobjekten unter der Tabelle).Und wenn Sie sicher sind, dass das Array niemals
null
beginnen soll, können Sie es vereinfachen, um:Beachten Sie, dass, wenn Sie einer geordneten Sammlung Elemente hinzufügen möchten, dies
List
wahrscheinlich die gewünschte Datenstruktur ist und nicht zunächst ein Array.quelle
Sehr alte Frage, wollte diese aber noch hinzufügen.
Wenn Sie nach einem Einzeiler suchen, können Sie den folgenden Code verwenden. Es kombiniert den Listenkonstruktor, der eine Aufzählung akzeptiert, und die "neue" (seit der Frage aufgeworfene) Initialisierersyntax.
quelle
Arrays in C # sind unveränderlich , zum Beispiel
string[]
,int[]
. Das bedeutet, dass Sie die Größe nicht ändern können. Sie müssen ein brandneues Array erstellen.Hier ist der Code für Array.Resize :
Wie Sie sehen, wird ein neues Array mit der neuen Größe erstellt, der Inhalt des Quellarrays kopiert und der Verweis auf das neue Array festgelegt. Der Hinweis hierfür ist das Schlüsselwort ref für den ersten Parameter.
Es gibt Listen, die neue Slots dynamisch für neue Elemente zuweisen können. Dies ist zB List <T> . Diese enthalten unveränderliche Arrays und ändern deren Größe bei Bedarf (List <T> ist keine Implementierung einer verknüpften Liste!). ArrayList ist dasselbe ohne Generics (mit Object- Array).
LinkedList <T> ist eine echte Implementierung einer verknüpften Liste. Leider können Sie der Liste nur LinkListNode <T> -Elemente hinzufügen, sodass Sie Ihre eigenen Listenelemente in diesen Knotentyp einschließen müssen. Ich denke, seine Verwendung ist ungewöhnlich.
quelle
Aray.Resize
ein Array kann seine Größe ändern, ohne seinen Inhalt zu verlieren. docs.microsoft.com/en-us/dotnet/api/…quelle
Sie können die Antwort von @Stephen Chung erweitern, indem Sie seine LINQ-basierte Logik verwenden, um eine Erweiterungsmethode mit einem generischen Typ zu erstellen.
Sie können es dann direkt auf dem Array aufrufen.
Zugegeben, die AddRangeToArray () -Methode scheint etwas übertrieben, da Sie mit Concat () dieselbe Funktionalität haben, aber auf diese Weise kann der Endcode direkt mit dem Array "arbeiten", im Gegensatz dazu:
quelle
Es ist besser, das Array unveränderlich und fest zu halten.
Sie können
Add
mitExtension Method
und simulierenIEnumerable.Concat()
quelle
Wenn Sie aus irgendeinem Grund viel mit Arrays und nicht mit Listen arbeiten, kann diese generische generische Rückgabemethode
Add
hilfreich seinquelle
Alle vorgeschlagenen Antworten machen dasselbe wie das, was sie vermeiden möchten, erstellen ein neues Array und fügen einen neuen Eintrag hinzu, nur mit mehr Overhead verloren. LINQ ist keine Zauberei. Die Liste von T ist ein Array mit einem Pufferbereich mit zusätzlichem Speicherplatz, um zu vermeiden, dass die Größe des inneren Arrays beim Hinzufügen von Elementen geändert wird.
Alle Abstraktionen müssen das gleiche Problem lösen, ein Array ohne leere Slots erstellen, die alle Werte enthalten, und diese zurückgeben.
Wenn Sie die Flexibilität benötigen und eine ausreichend große Liste erstellen können, die Sie zum Übergeben verwenden können, tun Sie dies. Verwenden Sie andernfalls ein Array und geben Sie das threadsichere Objekt frei. Mit dem neuen Span können Sie auch Daten gemeinsam nutzen, ohne die Listen kopieren zu müssen.
Um die Frage zu beantworten:
quelle
Wenn Sie also ein vorhandenes Array haben, ist meine schnelle Lösung
Ersetzen Sie jetzt einfach das ursprüngliche Array durch das neue
quelle
Eine neue
Append<TSource>
Methode wurde hinzugefügtIEnumerable<TSource>
Seit .NET Framework 4.7.1 und .NET Core 1.0 wurde .So verwenden Sie es:
Beachten Sie, dass Sie
Prepend<TSource>
stattdessen die neue Methode verwenden können, wenn Sie das Element am Anfang des Arrays hinzufügen möchten .quelle
Die Verwendung einer Liste ist die beste Option für die Speicherverwaltung.
quelle
Was ist mit einer Erweiterungsmethode? Zum Beispiel:
zum Beispiel:
Beachten Sie, dass dies das Verhalten der Uniion-Erweiterung von Linq nachahmt (mit der zwei Arrays zu einem neuen kombiniert werden), und dass die Linq-Bibliothek funktionieren muss.
quelle
Ich stimme Ed zu. C # macht dies nicht so einfach wie VB mit ReDim Preserve. Ohne eine Sammlung müssen Sie das Array in ein größeres kopieren.
quelle
ReDim Preserve
Kopiert das Array einfach in ein größeres. Es gibt keine wundersame Größenänderung des Arrays.quelle
quelle
Probieren Sie die Stringbuilder- Klasse aus. Es hat Methoden wie .insert und .append. Weitere Informationen finden Sie hier: http://msdn.microsoft.com/en-us/library/2839d5h5(v=vs.71).aspx
quelle
Leider funktioniert die Verwendung einer Liste nicht in allen Situationen. Eine Liste und ein Array unterscheiden sich tatsächlich und sind nicht zu 100% austauschbar. Es würde von den Umständen abhängen, ob dies eine akzeptable Lösung wäre.
quelle
Da diese Frage mit der angegebenen Antwort nicht zufrieden ist, möchte ich diese Antwort hinzufügen :)
quelle