如果有一类像这样的小部件:
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)?
选择一个吗? (我试图理解明显更好,因为我真正的区别并没有给我明显的结果。)
答案 0 :(得分:2)
区别于比较器确定的任何东西;因此,如果有3个不同的对象具有相同的价格,并且您的自定义比较器仅查看价格,那么它应该将它们视为同一个,具体取决于比较的方式。
HTH。
答案 1 :(得分:2)
答案必须是'它取决于'不同的应该考虑三个相同而且只保留一个,这通常是第一个但由于Distinct是一个扩展方法,它将依赖于扩展的实现和方法结果“找到”该方法。这又取决于“接近度”,因此在具有相同Comparer的相同IEnumerable对象上调用Distinct可能会产生两个不同的结果。例如。如果Distinct的“最近”实现在两个呼叫站点上不同
答案 2 :(得分:2)
这确实是一个哲学问题。您正在定义平等意味着价格相等。因此,根据您的定义,无论Type值是什么,它们都是相同的。
所以,答案是:返回哪一个并不重要。他们都是一样的。您不应该关心或预测返回哪一个,并且Distinct的实施保留了对您进行更改的权利......因为从a == b == c的角度来看它们都是相同的。
如果事实证明你确实关心哪一个被归还,那么你已经错误地定义了你的平等比较,你需要重新考虑你的平等功能。