Linq Distinct 不返回预期值

Linq Distinct not returning expected values

我正在尝试从自定义集合中获取不同项目的列表,但是比较似乎被忽略了,因为我的列表中不断出现重复项。我已经调试了代码,我可以清楚地看到我正在比较的列表中的值是相等的...

注意:Id 和 Id2 值是字符串

自定义比较器:

public class UpsellSimpleComparer : IEqualityComparer<UpsellProduct>
{
    public bool Equals(UpsellProduct x, UpsellProduct y)
    {
        return x.Id == y.Id && x.Id2 == y.Id2;
    }

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

调用代码:

var upsellProducts = (Settings.SelectedSeatingPageGuids.Contains(CurrentItem.ID.ToString())) ?
                              GetAOSUpsellProducts(selectedProductIds) : GetGeneralUpsellProducts(selectedProductIds);

// we use a special comparer here so that same items are not included
var comparer = new UpsellSimpleComparer();
return upsellProducts.Distinct(comparer);

很可能 UpsellProduct 具有 GetHashCode 的默认实现,即每个引用类型实例的 returns 唯一值。

要修复 - 在 UpsellProduct 或比较器中正确实施一个。

public class UpsellSimpleComparer : IEqualityComparer<UpsellProduct>
{
   public bool Equals(UpsellProduct x, UpsellProduct y)
   {
       return x.Id == y.Id && x.Id2 == y.Id2;
   }

   // sample, correct GetHashCode is a bit more complex
   public int GetHashCode(UpsellProduct obj)
   {
      return obj.Id.GetHashCode() ^ obj.Id2.GetHashCode();
   }

}

注意更好的代码来计算组合 GetHashCode 检查 Concise way to combine field hashcodes? and Is it possible to combine hash codes for private members to generate a new hash code?

您的 GetHashCode() 没有 return 相同的值,即使两个 UpsellProduct 实例被您的 Equals() 方法视为相等。

使用类似这样的东西来反映相同的逻辑。

public int GetHashCode(UpsellProduct obj)
{
    return obj.Id.GetHashCode() ^ obj.Id2.GetHashCode();
}