使用自定义比较器调用Distinct时返回什么?

时间:2010-01-22 18:39:37

标签: c# collections lambda

如果有一类像这样的小部件:

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 个答案:

答案 0 :(得分:2)

区别于比较器确定的任何东西;因此,如果有3个不同的对象具有相同的价格,并且您的自定义比较器仅查看价格,那么它应该将它们视为同一个,具体取决于比较的方式。

HTH。

答案 1 :(得分:2)

答案必须是'它取决于'不同的应该考虑三个相同而且只保留一个,这通常是第一个但由于Distinct是一个扩展方法,它将依赖于扩展的实现和方法结果“找到”该方法。这又取决于“接近度”,因此在具有相同Comparer的相同IEnumerable对象上调用Distinct可能会产生两个不同的结果。例如。如果Distinct的“最近”实现在两个呼叫站点上不同

答案 2 :(得分:2)

这确实是一个哲学问题。您正在定义平等意味着价格相等。因此,根据您的定义,无论Type值是什么,它们都是相同的。

所以,答案是:返回哪一个并不重要。他们都是一样的。您不应该关心或预测返回哪一个,并且Distinct的实施保留了对您进行更改的权利......因为从a == b == c的角度来看它们都是相同的。

如果事实证明你确实关心哪一个被归还,那么你已经错误地定义了你的平等比较,你需要重新考虑你的平等功能。