LINQ Distinct()甚至无法实现Equals()和GetHashCode()

sho*_*ole 2 c# linq

在问这个简单的问题之前我做了一些研究,但仍然无法使它工作......

下面是我的对象类和我的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; }
  }
Run Code Online (Sandbox Code Playgroud)

 

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();
Run Code Online (Sandbox Code Playgroud)

但结果集显然ItemGridViewModel与具有相同ItemID的几个重复...

可能的原因是什么?如何解决?

Jus*_*ner 7

你已经在你的网站中实现了错误的界面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();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你的不同呼吁是:

// rest of query
select new ItemGridViewModel()
{
    // assignment
}).Distinct(new ItemGridViewModelEqualityComparer());
Run Code Online (Sandbox Code Playgroud)

  • @shole - 不用担心.这是一个常见的错误.这并不意味着你的愚蠢,只是你需要更多的练习. (2认同)