Entonces tengo una colección de objetos. El tipo exacto no es importante. De él quiero extraer todos los pares únicos de un par de propiedades particulares, por lo tanto:
myObjectCollection.Select(item=>new
{
Alpha = item.propOne,
Bravo = item.propTwo
}
).Distinct();
Entonces mi pregunta es: ¿Distinct en este caso usará el objeto predeterminado igual (que será inútil para mí, ya que cada objeto es nuevo) o se le puede pedir que haga un igual diferente (en este caso, valores iguales de Alpha y Bravo => instancias iguales)? ¿Hay alguna forma de lograr ese resultado, si esto no lo hace?
Respuestas:
Lee aquí la excelente publicación de K. Scott Allen:
E igualdad para todos ... Tipos anónimos
La respuesta corta (y cito):
Por lo tanto, es totalmente seguro usar el método Distinct () en una consulta que devuelve tipos anónimos.
fuente
Perdón por el mal formato anterior
fuente
object
yobject
. Si los dosobject
esstring
aún devolver las filas duplicadas. Pruebe elFirstName
is typeofobject
y asigne con el mismostring
allí.Interesante que funcione en C # pero no en VB
Devuelve las 26 letras:
Devuelve 52 ...
fuente
Key
palabra clave al tipo anónimo.Distinct()
, funcionará según lo previsto (por ejemploNew With { Key .lower = x.ToString.ToLower(), Key .upper = x.ToString.ToUpper()}
).new {A = b}
esNew {Key .A = b}
. Las propiedades no clave en las clases anónimas de VB son mutables, por lo que se comparan por referencia. En C #, todas las propiedades de las clases anónimas son inmutables.Ejecuté una pequeña prueba y descubrí que si las propiedades son tipos de valor, parece funcionar bien. Si no son tipos de valor, entonces el tipo necesita proporcionar sus propias implementaciones Equals y GetHashCode para que funcione. Las cuerdas, creo, funcionarían.
fuente
Puede crear su propio método de extensión distinta que toma la expresión lambda. Aquí hay un ejemplo
Cree una clase que se derive de la interfaz IEqualityComparer
Luego cree su método de extensión distinta
y puedes usar este método para encontrar elementos distintos
fuente
object
yobject
. Si los dosobject
esstring
aún devolver las filas duplicadas. Pruebe elFirstName
is typeofobject
y asigne con el mismostring
allí.Si
Alpha
yBravo
tanto heredar de una clase común, usted será capaz de dictar la comprobación de la igualdad en la clase padre mediante la implementaciónIEquatable<T>
.Por ejemplo:
fuente
Hola, tuve el mismo problema y encontré una solución. Debe implementar la interfaz IEquatable o simplemente anular los métodos (Equals & GetHashCode). Pero este no es el truco, el truco que viene en el Método GetHashCode. No debe devolver el código hash del objeto de su clase, pero debe devolver el hash de la propiedad que desea comparar de esa manera.
Como puede ver, obtuve una clase llamada persona que obtuvo 3 propiedades (Nombre, Edad, IsEgyptian "Porque lo soy") En el GetHashCode devolví el hash de la propiedad Nombre, no el objeto Persona.
Pruébalo y funcionará ISA. Gracias Modather Sadik.
fuente
public override int GetHashCode() { return this.Name.GetHashCode() ^ this.Age.GetHashCode() ^ this.IsEgyptian.GetHashCode(); }
Para que funcione en VB.NET, debe especificar la
Key
palabra clave antes de cada propiedad en el tipo anónimo, así:Estaba luchando con esto, pensé que VB.NET no era compatible con este tipo de característica, pero en realidad lo hace.
fuente