2017-01-07 3 views
-4

Lassen Sie uns sagen, ich habe ein Array von Strings von der Ausführung dieses Split-MethodeWann und beste Weg, exakte Kopien von Zeichenketten in C#

string[] parsed = message.Split(' '); 

Und dann machen möchte ich in einem neuen einen bestimmten Wert dieses Arrays speichern

String
string name = parsed[3]; 

nun diese Zeichenfolge aus dem Array mit einer Erweiterung Methode, die ich entfernen, entfernt diese Methode den Wert am angegebenen Index und verschiebt alles wieder die Lücke

parsed = parsed.RemoveAt(3); 
zu füllen

Ich bin mir bewusst, dass, weil Zeichenfolgen Verweistypen in C# sind, meine Namensvariable jetzt null ist, nachdem ich etwas gesucht habe, wurde mir gesagt, dass das Erstellen von genauen Kopien von Zeichenfolgen in C# nutzlos ist. Was ist der beste und korrekte Weg, um die Namensvariable als neue Instanz festzulegen, damit sie nach dem Aufruf von .RemoveAt() nicht gelöscht wird?

EDIT:

Dies ist die beste Art und Weise, die ich bisher

gefunden
string name = new string(parsed[3].ToCharArray()); 

Ein anderer Weg vorgeschlagen von Willy David Jr

parsed = parsed.Where((source, index) => index != 3).ToArray(); 

EDIT 2:

Bitte ignorieren Sie diese Frage und las die genehmigte Antwort, ich missverstanden, wie Referenztypen arbeiten.

+1

Mach dir einfach keine Sorgen. C# verfügt über eine automatische Speicherbereinigung. Lassen Sie den Sammler seine Arbeit machen und Sie können sich um etwas anderes sorgen. Ihre Überzeugung, dass das Komprimieren des Arrays den Wert Ihrer lokalen Variablen ändert, ist falsch. –

+1

Woran denken Sie, dass 'name' nach dem Entfernen eines Elements aus dem Array null ist? 'name' interessiert nicht, was mit dem Array passiert - es enthält immer noch einen Verweis auf den String, dem Sie es zugewiesen haben. –

+0

Nun, dann muss ich etwas falsch verstehen, wie Referenzen funktionieren, die Zeichenfolge wird auch dann noch existieren, wenn ich sie aus dem Array entferne? so weit ich weiß, würde es Müll gesammelt werden, weil keine anderen Referenzen darauf zeigen werden – user7386753

Antwort

1

Sie missverstehen, wie Referenztypen funktionieren. Das Entfernen eines Objekts aus einem Array ändert dieses Objekt in keiner Weise - es bedeutet lediglich, dass das Array keine Referenz für das Objekt mehr enthält.

Sie können dies selbst testen. Führen Sie den Code aus, den Sie im Debugger (oder in einer Konsolenanwendung) angegeben haben, und zeigen Sie am Ende den Wert name an (oder drucken Sie ihn aus).

Die Sache, die kann Trick Sie mit Referenztypen tritt auf, wenn es zwei Variablen (oder Arrays oder was auch immer), die eine Referenz auf das gleiche Objekt enthalten.In diesem Fall werden Änderungen am Objekt über eine Variable wiedergegeben, wenn auf das Objekt über eine andere Variable zugegriffen wird - es ist das gleiche Objekt, aber mit zwei verschiedenen Variablen referenziert es. Wenn Sie möchten, dass beide Variablen auf ihre eigene "Kopie" des Objekts verweisen, müssen Sie selbst eine Kopie erstellen und sie einer der Variablen zuweisen.

jedoch in C#, die string Typ ist unveränderlich, was bedeutet, dass, sobald ein string Objekt erstellt wird, gibt es keine Möglichkeit, das Objekt zu ändern. Es gibt also keinen Grund, eine Kopie einer Zeichenkette zu erstellen. Wenn es eine Variable gibt, die auf eine bestimmte Zeichenfolge verweist, können Sie sicher sein, dass keine andere Referenz diese unter Ihnen ändern kann.

+0

Ich sehe, danke für die Antwort. – user7386753

-1

Sind Sie sicher, dass RemoveAt an Ihrer Zeichenfolge vorhanden ist? Es gibt RemoveAt bei Collections, aber nicht bei String- oder String-Arrays.

Sie können dies stattdessen tun:

List<string> lstParse = new List<string>(); 

foreach (var i in parsed) 
    { 
     lstParse.Add(i); 
    } 
string name = parsed[3];  
lstParse.RemoveAt(3); 

Um die Liste zu kommen wieder und wandelt es in string:

string strResult = string.Join(" ", lstParse.ToArray()); 

Wenn Sie wirklich Index ohne eine neue Liste von Objekt entfernen möchten, Mißachtung der Code oben und Sie können diese eine Zeile stattdessen tun:

+0

Das ist meine RemoveAt Methode https://hastebin.com/opucotefaz.cs – user7386753

+0

Sie erwähnen das Sie haben eine Erweiterungsmethode hinzugefügt. Was Sie tun, wird das gleiche Verhalten wie das OP geben. –

+0

_Verwendung einer Erweiterungsmethode_? – Badiparmagi

0

Warum denkst du dein name Variable sollte null sein? Es bleibt nach dem Entfernen aus dem Array unberührt. Ihr ursprünglicher Code reicht aus, um das zu erreichen, was Sie wünschen.

+0

Wie ist es unberührt, wenn Name nur auf die Zeichenfolge in geparste [] verweist, die entfernt wurde – user7386753

+1

Es wird aus dem Array entfernt, aber 'name' Variable zeigt immer noch auf diese Zeichenfolge. Lesen Sie bitte vor dem Abheben über C# Grundlagen. –

+0

Ich habe Sir nicht abgemeldet, in der Tat habe ich nicht genug Rep, um über Kommentare noch zu abstimmen. Danke für die Antwort – user7386753

Verwandte Themen