Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ Distinct()不起作用,甚至实现了Equals();GetHashCode()_C#_Linq - Fatal编程技术网

C# LINQ Distinct()不起作用,甚至实现了Equals();GetHashCode()

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; }

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

下面是我的对象类和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; }
  }
但结果集显然重复了几个具有相同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());