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();
}
我正在尝试从自定义集合中获取不同项目的列表,但是比较似乎被忽略了,因为我的列表中不断出现重复项。我已经调试了代码,我可以清楚地看到我正在比较的列表中的值是相等的...
注意: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();
}