Come ottenere un valore da un dizionario generico utilizzando un confronto personalizzato per la chiave?
-
28-10-2019 - |
Domanda
Ho un dizionario generico di oggetti e desidero utilizzare un confronto personalizzato per aggiornare il valore nel dizionario.
myObjects
Contiene un dizionario di oggetti e il valore è il numero di volte in cui esiste l'oggetto. Si noti che il valore può essere incrementato numerosi volte utilizzando diversi comparatori o rimosso del tutto.
testObject
è il mio oggetto personalizzato.
customComparer
è un confronto in modo dinamico in base al tipo di test object. Ma tutti i confronti sono del tipo IEqualityComparer<MyObject>
IDictionary<MyObject, int> myObjects;
var testObject;
var customComparer;
if (myObjects.Keys.Contains(testObject, customComparer))
{
//get the value, if its > 1 then decrement the value
//else remove the entry entirely
//not sure how to get the value based on my custom comparer??
//this code below does not work because it requires the custom comparer
//var occurrences = myObjects[testObject];
//if (occurrences > 1)
// myObjects[testObject]--;
//else
// myObjects.Remove(testObject);
}
else
{
myObjects.Add(testObject, 1);
}
Posso usare le chiavi. Per determinare se l'oggetto esiste con il confronto personalizzato, ma non sono sicuro di come aggiornare il valore?
Soluzione 2
Non c'è stata una rapida immlpementazione per questo. Invece, ho creato un complotto IEquality wrapper che ospitava numerosi confronto di uguaglianza interna. Il wrapper ha sovrascritto gli uguali e i metodi GetHashCode che hanno scelto il dizionario interno appropriato dei confronto di uguaglianza basato su una proprietà dall'oggetto di confronto.
public class WrapperComparer : IEqualityComparer<MyObject>
{
private IDictionary<string, IEqualityComparer<MyObject>> _myComparerList;
public bool Equals(MyObject x, MyObject y)
{
var comparer = _myComparerList[x.SomeProperty];
return comparer.Equals(x, y);
}
public bool GetHashCode(MyObject obj)
{
var comparer = _myComparerList[obj.SomeProperty];
return comparer.GetHashCode(obj);
}
}
Quindi il confronto funziona ...
var testObject;
var customComparer = new WrapperComparer(list of comparers here);
IDictionary<MyObject, int> myObjects =
new Dictionary<MyObject, int>(customComparer);
if (myObjects.ContainsKey(testObject))
{
var occurrences = myObjects[testObject];
if (occurrences > 1)
myObjects[testObject]--;
else
myObjects.Remove(testObject);
}
else
{
myObjects.Add(testObject, 1);
}
Altri suggerimenti
Quando crei il dizionario dovresti fornire la tua usanza IEqualityComparer
nel costruttore. Non è possibile modificare l'uguaglianza dopo che il dizionario è stato costruito.
Voi Potevo Iterazione sulle coppie di valore chiave fino a trovare una chiave che corrisponde in base al tuo confronto personalizzato, ma non si sfrutta le funzionalità fornite da un dizionario.