Что возвращается, когда Distinct вызывается с пользовательским компаратором? - PullRequest
2 голосов
/ 22 января 2010

Если есть класс виджетов, как это:

public class Widget
{
   public double Price { get; set; }
   public string Type { get; set; }
   public int ID { get; set; }
   public string Name { get; set; }
}

И создайте их список:

List<Widget> Widgets = new List<Widget>
   {
       new Widget {ID = 1, Name = "One", Price = 3.00, Type = "Gooy"},
       new Widget {ID = 2, Name = "Two", Price = 5.00, Type = "Crispy"},
       new Widget {ID = 2, Name = "Three", Price = 3.00, Type = "Hard"},
       new Widget {ID = 2, Name = "Four", Price = 3.00, Type = "Chewy"},
       new Widget {ID = 2, Name = "Five", Price = 2.50, Type = "Gooy"}
   };

А потом я вызываю IEnumerable.Distinct с помощью специального компаратора, например:

IEqualityComparer<Widget> widgetComparer = 
   new LambdaComparer<Widget>((item1, item2) => item1.Price == item2.Price);

Widgets.Distinct(widgetComparer);

Тогда (как я понимаю) должно быть возвращено 3 объекта (по одному для каждой ценовой категории).

Какой тип 3,00 (Gooy, Hard или Chewy)?

Он выбирает один? (Я пытаюсь лучше понять различие, потому что мое настоящее различие не дает мне отличных результатов.)

Ответы [ 3 ]

2 голосов
/ 22 января 2010

Что ж, ответ должен быть «это зависит», отличные должны рассматривать три одинаковых и сохранять только один, который обычно является первым, но так как Distinct является методом расширения, он также будет зависеть от реализации расширения и от метод восстановления "нахождения" метода. Что опять-таки зависит от "близости", поэтому вызов Distinct для одного и того же объекта IEnumerable с одним и тем же Comparer может дать два разных результата. Например. Если «ближайшая» реализация Distinct отличается на двух сайтах вызова

2 голосов
/ 23 января 2010

Это действительно вопрос философии. Вы определяете равенство, чтобы означать, что цена равна. Поэтому, исходя из вашего определения, они равны независимо от значения типа.

Итак, ответ таков: не имеет значения, кто возвращается. Они все одинаковы. Вы не должны заботиться или предугадывать, какой из них будет возвращен, и реализация Distinct оставляет за собой право изменить его на вас ... потому что они все одинаковы с точки зрения a == b == c.

Если выясняется, что вам все равно, какой из них возвращается, вы неправильно определили сравнение на равенство, и вам нужно переосмыслить функцию равенства.

2 голосов
/ 22 января 2010

Distinct принимает то, что определяет компаратор; так что если есть 3 разных объекта с одинаковой ценой, и ваш пользовательский компаратор смотрит только на цену, то он должен считать их одинаковыми, в зависимости от того, как происходит сравнение.

НТН.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...