Ich möchte einen Schlüssel in einem Wörterbuch und den Wert ersetzen, wenn es gefunden wird oder den Schlüssel/Wert hinzufügen, wenn es nicht ist .Erstellen Sie Wörterbuch mit LINQ und vermeiden Sie "Element mit dem gleichen Schlüssel wurde bereits hinzugefügt" Fehler
Code:
public class MyObject
{
public string UniqueKey { get; set; }
public string Field1 { get; set; }
public string Field2 { get; set; }
}
LINQ Solution (wirft An item with the same key has already been added.
):
Dictionary<string, MyObject> objectDict = csvEntries.ToDictionary(csvEntry => csvEntry.ToMyObject().UniqueKey, csvEntry => csvEntry.ToMyObject());
FürJeden Lösung (Werke):
Dictionary<string, MyObject> objectDict = new Dictionary<string, MyObject>();
foreach (CSVEntry csvEntry in csvEntries)
{
MyObject obj = csvEntry.ToMyObject();
if (objectDict.ContainsKey(obj.UniqueKey))
{
objectDict[obj.UniqueKey] = obj;
}
else {
objectDict.Add(obj.UniqueKey, obj);
}
}
ich wirklich die LINQ-Lösung mochte aber, wie es steht , es löst den obigen Fehler aus. Gibt es eine nette Möglichkeit, den Fehler zu vermeiden und LINQ zu verwenden?
Verwenden 'ToLookup' statt' ToDictionary' – EZI
Ich würde eine Klasse 'MyObjectComparer' erstellen, die' IEqualityComparer 'implementiert und verwenden Sie die folgende Zeile ein:' Dictionary objectDict = csvEntries.Select (Eintrag => entry.ToMyObject()). Distinct (neu MyObjectComparer()). ToDictionary (csvEntry => csvEntry.UniqueKey, csvEntry => csvEntry); ' –
Der Indexer fügt das Element hinzu, wenn es existiert, so dass Sie den' ContainsKey einfach entfernen können 'check und benutze immer' objectDict [obj.UniqueKey] = obj'. – Lee