Come ottenere un valore da un dizionario generico utilizzando un confronto personalizzato per la chiave?

StackOverflow https://stackoverflow.com/questions/8389257

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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top