[英]LINQ Distinct() not work even implemented Equals() & GetHashCode()
在問這個簡單的問題之前我做了一些研究,但仍然無法使它工作......
下面是我的對象類和我的LINQ查詢
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; }
}
var query = (from ccp in CostCenterParaQuery
where ccp.CostCentreID != null && costCenterList2.Contains(ccp.CostCentreID.Value)
select ccp into g
from s in StoreRoomQuery
where s.CostCentreCode == g.CostCentreCode
select s into g2
from b in BinItemStatQuery
where b.Qty > 0 && b.IsFrozen == "N" && b.StoreroomID == g2.StoreroomID
select b into g3
from i in ItemsQuery
where ((i.ItemID == g3.ItemID) &&
(whereClause.Code == null || i.ItemCode == whereClause.Code) &&
(whereClause.Description == null || i.Description == whereClause.Description))
select new ItemGridViewModel()
{
Qty = g3.Qty,
Code = i.ItemCode,
Description = i.Description,
ItemID = i.ItemID
}).Distinct();
但結果集明顯重復了幾個具有相同ItemID的ItemGridViewModel
...
可能的原因是什么?如何解決?
您已在ItemGridViewModel
實現了錯誤的接口。 根據用法,我想你想要IEquatable<T>
。
IEqualityComparer<T>
用於構建一個單獨的對象,該對象的職責僅僅是比較類型為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();
}
}
然后你的不同呼吁是:
// rest of query
select new ItemGridViewModel()
{
// assignment
}).Distinct(new ItemGridViewModelEqualityComparer());
實現IEquatable<T>
接口。
public class ItemGridViewModel: IEquatable<ItemGridViewModel>
{
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.