¿Cómo obtener un valor de un diccionario genérico usando un comparador personalizado para la clave?
-
28-10-2019 - |
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.
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.
Tú 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.