C # группа для устранения дубликатов - PullRequest
0 голосов
/ 07 марта 2011

Я работаю с большим набором данных точек интереса (POI), которые имеют значения Lat / Long.

Я хочу отфильтровать POI, которые находятся в непосредственной близости друг от друга. Я думаю, что для достижения этого я могу округлить широту / долготу до X десятичных знаков и сгруппировать по результатам (или позвонить Distinct() или что-то еще) ...

Я написал небольшое заявление LINQ, которое, кажется, не выполняет то, что я хочу,

 var l1 = (from p in PointsOfInterest where p.IsVisibleOnMap select p).Distinct(new EqualityComparer()).ToList();

, где EqualityComparer равно

public class EqualityComparer : IEqualityComparer<PointOfInterest>
{
    public bool Equals(PointOfInterest x, PointOfInterest y)
    {
        return Math.Round(x.Latitude.Value, 4) == Math.Round(y.Latitude.Value, 4) && 
            Math.Round(x.Longitude.Value, 4) == Math.Round(y.Latitude.Value, 4);
    }

    public int GetHashCode(PointOfInterest obj)
    {
        return obj.GetHashCode();
    }
}

но метод Equals никогда не вызывается?!?

Есть какие-нибудь мысли о том, как это сделать?

Ответы [ 3 ]

5 голосов
/ 07 марта 2011

Equals() никогда не вызывается, потому что GetHashCode() возвращает разные значения для любых двух объектов, поскольку вы используете GetHashCode(), определенный в System.Object классе. Вам нужно будет реализовать GetHashCode () немного по-другому.

попробуйте что-то вроде

public int GetHashCode(PointOfInterest obj)
{
    return obj.Longitude.Value.GetHashCode() ^ obj.Latitude.Value.GetHashCode();
}
3 голосов
/ 07 марта 2011

Это проблема:

public int GetHashCode(PointOfInterest obj)
{
    return obj.GetHashCode();
}

Вам также необходимо соответственно переопределить GetHashCode(), вероятно, в настоящее время все элементы считаются разными, поскольку хеш-код не совпадает.

Из MSDN для IEqualityComparer.GetHashCode():

Реализуйте этот метод, чтобы обеспечить индивидуальные хэш-коды для объекты, соответствующие индивидуальное сравнение равенства обеспечивается методом Equals.

1 голос
/ 07 марта 2011

Есть мысли о том, как это сделать?

Просто:

IEnumerable<PointOfInterest> result =
  from p in PointsOfInterest
  where p.IsVisibleOnMap
  group p by new
  {
    Latitude = Math.Round(p.Latitude.Value, 4),
    Longitude = Math.Round(p.Longitude.Value, 4)
  } into g
  let winner = g.First()
  select winner;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...