tengo esta clasecómo agrupar por tipos personalizados con LINQ
public class Item
{
public Coordinate coordinate { get; set; }
...
...
}
Con Coordinar se definen así:
public class Coordinate
{
public Coordinate(float latitude, float longitude)
{
Latitude = latitude;
Longitude = longitude;
}
public float Latitude { get; private set; }
public float Longitude { get; private set; }
}
Y yo quiero tener una consulta LINQ así:
var grouped = from it in items
group it by it.Coordinate into grp
select grp;
As mentioned here by MSDN Pensé que esto era posible si anulara Equals en mi clase de coordenadas:
Use un tipo con nombre si debe pasar la variable de consulta a otro método. Cree una clase especial utilizando propiedades implementadas automáticamente para las claves , y luego anule los métodos Igual y GetHashCode. También puede usar una estructura, en cuyo caso usted no debe estrictamente tener que anular esos métodos . Para obtener más información, consulte Cómo : Implementar una clase inmutable que posee propiedades implementadas-Auto
Igual aplicación para Coordinar la clase:
public override bool Equals(object obj)
{
var coord = obj as Coordinate;
if(coord == null) return false;
return (Latitude == coord.Latitude && Longitude == coord.Longitude);
}
todavía no puedo conseguir mi consulta LINQ para agrupar por coordenadas similares , ya que mi no prueba muestra:
[TestMethod]
public void GroupBy_3ItemsWith2DifferentCoordinates_Returns2Groups()
{
var items = new List<Item>
{
new Item {Coordinate = new Coordinate(10, 10)},
new Item {Coordinate = new Coordinate(10, 10)},
new Item {Coordinate = new Coordinate(12, 10)},
};
var grouped = from it in items
group it by it.Coordinate into g
select g;
Assert.AreEqual(2, grouped.Count());
}
Hay una sobrecarga de el método GrouBy que toma un IEqualityComparer como parámetro, pero ¿existe el equivalente usando la cláusula group? ¿Estoy haciendo algo mal? ¿Alguna idea?
Sólo probado, eso es lo que Estaba faltando.Gracias :) :) anulación pública int GetHashCode() { return ((int) Latitude * 100)^((int) Longitude * 100); } –
Si eso es lo que hace su código hash, debe asegurarse de que su código de igualdad coincida con él, deben ser coherentes entre sí. –
Latitude.GetHashCode()^Longitude.GetHashCode() da los mismos resultados cuando se invierte Latitud y Longitud. Entonces esa no fue una buena solución, ya que quiero asegurar que coord (x, y)! = Coord (y, x); Su código funciona ya que importa el orden de las operaciones. Gracias por la precisión, eso ayudó :) –