¿Cómo obtener un valor de un diccionario genérico usando un comparador personalizado para la clave?

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

Pregunta

Tengo un diccionario genérico de objetos y quiero usar un comparador personalizado para actualizar el valor en el diccionario.

myObjects contiene un diccionario de objetos y el valor es el número de veces que existe ese objeto.Tenga en cuenta que el valor puede incrementarse varias veces utilizando diferentes comparadores o eliminarse por completo.

testObject es mi objeto personalizado.

customComparer es un comparador que cambia dinámicamente según el tipo de testObject.pero todos los comparadores son 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);
}

Puedo usar Keys.Contains para determinar si el objeto existe con un comparador personalizado, pero no estoy seguro de cómo actualizar el valor.

¿Fue útil?

Solución 2

No hubo una implementación rápida para esto.En su lugar, creé un contenedor IEqualityComparer que albergaba numerosos comparadores de igualdad internos.El contenedor sobrescribió los métodos Equals y GetHashCode, que eligieron el diccionario interno apropiado de comparadores de igualdad en función de una propiedad del objeto de comparación.

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);
    }
}

Entonces la comparación funciona...

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);
}

Otros consejos

Cuando crea el diccionario, debe proporcionar su personalización IEqualityComparer en el constructor. No puede cambiar el comparador de igualdad después de construir el diccionario.

pudo Itere sobre los pares de valor clave hasta que encuentre una clave que coincida de acuerdo con su comparador personalizado, pero no está aprovechando las características que proporciona un diccionario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top