C# LINQ Distinct()不起作用,甚至实现了Equals();GetHashCode()
在提出这个简单的问题之前,我做了一些研究,但仍然无法使它起作用 下面是我的对象类和LINQ查询C# LINQ Distinct()不起作用,甚至实现了Equals();GetHashCode(),c#,linq,C#,Linq,在提出这个简单的问题之前,我做了一些研究,但仍然无法使它起作用 下面是我的对象类和LINQ查询 public class ItemGridViewModel: IEqualityComparer<ItemGridViewModel> { public ItemGridViewModel() { } public int ItemID { get; set; } public string Code { get; set; }
public class ItemGridViewModel: IEqualityComparer<ItemGridViewModel>
{
public ItemGridViewModel() { }
public int ItemID { get; set; }
public string Code { get; set; }
public string Description { get; set; }
public decimal Qty { get; set; }
public bool Equals(ItemGridViewModel x, ItemGridViewModel y)
{
return x.ItemID == y.ItemID;
}
public int GetHashCode(ItemGridViewModel obj) { return obj.ItemID; }
}
但结果集显然重复了几个具有相同ItemID的ItemGridViewModel
可能的原因是什么?我如何解决它?实现
IEquatable
接口
public class ItemGridViewModel: IEquatable<ItemGridViewModel>
{
...
}
公共类ItemGridViewModel:IEquatable
{
...
}
您在ItemGridViewModel
中实现了错误的接口。根据使用情况,我认为您需要IEquatable
IEqualityComparer
用于构建一个单独的对象,该对象只负责比较T
类型的对象:
public class ItemGridViewModel
{
// Your implementation
}
public class ItemGridViewModelEqualityComparer : IEqualityComparer<ItemGridViewModel>
{
public bool Equals(ItemGridViewModel a, ItemGridViewModel b)
{
return a.ItemID == b.ItemID;
}
public int GetHashCode(ItemGridViewModel o)
{
return o.ItemID.GetHashCode();
}
}
谢谢,贾斯汀快了几秒钟,所以我接受了他的回答@肖尔,实际上我是第一个回答的;)检查答案的时间:汉克斯,我很笨,希望有人能解决这个问题too@shole-不用担心。这是一个常见的错误。这并不意味着你是哑巴,只是你需要更多的练习。或者只是常规的
覆盖对象。等于/对象。GetHashCode
会起作用。@Justiniessner谢谢,这是给几乎和我一样哑巴的人的一个提示:如果你使用IQueryable,你必须在调用Distinct(lEqualityComparer)之前使用AsEnumerable(),因为IQueryable本身只是一个表达式树
public class ItemGridViewModel
{
// Your implementation
}
public class ItemGridViewModelEqualityComparer : IEqualityComparer<ItemGridViewModel>
{
public bool Equals(ItemGridViewModel a, ItemGridViewModel b)
{
return a.ItemID == b.ItemID;
}
public int GetHashCode(ItemGridViewModel o)
{
return o.ItemID.GetHashCode();
}
}
// rest of query
select new ItemGridViewModel()
{
// assignment
}).Distinct(new ItemGridViewModelEqualityComparer());