2017-11-16 5 views
0

Ich habe ein Wörterbuch, das ich kopieren muss, da es nicht möglich ist, ein Wörterbuch in einer foreach-Schleife zu ändern. (Wird zu dem Fehler führen „Collection wurde modifiziert; Aufzählung kann möglicherweise nicht ausgeführt“) Nachdem ichC# int enthält keine Definition für Clone

dictTemp.Add(dict); 
gelernt

wird nur ein Wörterbuch zum anderen verweisen. Ich versuchte es

foreach (KeyValuePair<string, int> entry in dict) 
{ 
    if (!dict.ContainsKey(entry.Key)) 
    { 
     dictTemp.Add(entry.Key, entry.Value); 
    } 
    else 
    { 
     dictTemp[entry.Key] = entry.Value; 
    } 
} 

zu kopieren, aber ich Schweller die Fehler bekamen und so denke ich das Hinzufügen des Schlüssels und der Wert ist nur eine Referenz. Ich habe über das Problem nachgeschaut und eine Lösung durch Deep Copy mit Clone (.Net 2.0) gefunden. https://stackoverflow.com/a/139841/3772108

foreach (KeyValuePair<string, int> entry in dict) 
{ 
    if (!dict.ContainsKey(entry.Key)) 
    { 
     dictTemp.Add(entry.Key, entry.Value.Clone()); 
    } 
    else 
    { 
     dictTemp[entry.Key] = entry.Value; 
    } 
} 

Aber es ist nicht möglich, in .Net 4.5 wegen der Meldung „‚int‘enthält keine Definition für Klon und keine Erweiterung Methode Clone ein erstes Argument vom Typ‚int‘Annahme gefunden werden konnte“

Jetzt ist meine Frage im Jahr 2017, wie ist es möglich, ein Wörterbuch vollständig zu kopieren. (Nicht referenzieren) Oder gibt es einen klüger/besseren Weg?

+0

Wenn Sie möchte Wörterbuch kopieren (obwohl ich bezweifle, dass Sie wirklich brauchen), im Jahr 2017 können Sie 'var kopieren = dict.ToDictionary (c => c.Key, c => c.Value);' – Evk

Antwort

3

Zuerst versuchen Sie, ein int nicht das Wörterbuch zu klonen. Sie müssen Werttypen nicht klonen, sondern sie der Variablen zuweisen und erhalten einen "Klon".

Ihre foreach -loop hat auch ein Fehler, überprüfen Sie, ob !dict.ContainsKey statt !dictTemp.ContainsKey:

foreach (KeyValuePair<string, int> entry in dict) 
{ 
    if (!dictTemp.ContainsKey(entry.Key)) 
    { 
     dictTemp.Add(entry.Key, entry.Value); 
    } 
    else 
    { 
     dictTemp[entry.Key] = entry.Value; 
    } 
} 

Schließlich Sie die constructor verwenden können, einen "Klon" zu erhalten:

var dictTemp = new Dictionary<string, int>(dict); 
+0

Danke für den Hinweis mit der Fehler. Ich habe es total übersehen. Die Lösung mit dem Konstruktor ist einfach super! Genau das habe ich gesucht! Danke vielmals. :) – user3772108

Verwandte Themen