Voglio trovare una chiave in un dizionario e sostituire il valore se viene trovato o aggiungere la chiave/valore se non è .Crea dizionario con LINQ ed evita "elemento con la stessa chiave è già stato aggiunto" errore
Codice:
public class MyObject
{
public string UniqueKey { get; set; }
public string Field1 { get; set; }
public string Field2 { get; set; }
}
LINQ Solution (getta An item with the same key has already been added.
):
Dictionary<string, MyObject> objectDict = csvEntries.ToDictionary(csvEntry => csvEntry.ToMyObject().UniqueKey, csvEntry => csvEntry.ToMyObject());
soluzione foreach (opere):
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);
}
}
Mi è piaciuto molto la soluzione LINQ ma così com'è , genera l'errore sopra riportato. C'è un modo carino per evitare l'errore e usare LINQ?
Usa 'ToLookup' invece di' ToDictionary' – EZI
vorrei creare un 'MyObjectComparer' classe che implementa' 'IEqualityComparer e utilizzare la seguente riga:' Dictionary objectDict = csvEntries.Select (ingresso => entry.ToMyObject()). Distinct (new MyObjectComparer()). ToDictionary (csvEntry => csvEntry.UniqueKey, csvEntry => csvEntry); ' –
L'indicizzatore aggiunge l'elemento se esiste, quindi è sufficiente rimuovere' ContainsKey 'controlla e usa sempre' objectDict [obj.UniqueKey] = obj'. – Lee