【问题标题】:How do you call .Distinct() on an Array of objects [duplicate]您如何在对象数组上调用 .Distinct() [重复]
【发布时间】:2018-08-29 15:34:26
【问题描述】:

所以在控制器中,我接受如下对象列表:

    public virtual ActionResult Grid_Read([DataSourceRequest]DataSourceRequest request, IEnumerable<ObjDTO> objects)
    {
         var DistinctList = objects.Distinct();

         return Json(DistinctList.ToDataSourceResult(request), JsonRequestBehavior.AllowGet);
    }

但是 .Distinct() 对列表没有任何作用。

【问题讨论】:

  • 请在花时间发布此类内容之前进行搜索。这个问题之前已经被问过好几次了,关于这个话题已经有了很好的答案

标签: c# model-view-controller


【解决方案1】:

因此,要解决此问题,您需要导航到用作类型的 DTO,在本例中为“ObjDTO”。您将需要创建一个自定义相等比较器。

我使用以下代码来制作这个比较器:

public string Item1 {get;set;}
public int Item2 {get;set;}

public override bool Equals(object obj)
{
    var item = obj as ObjDTO;

    if (item == null)
    {
        return false;
    }

    return this.Item1 == item.Item1 && this.Item2 == item.Item2;
}

public override int GetHashCode()
{
    if (this.Item1 == null && this.Item2 == 0)
    {
        return base.GetHashCode();
    }

    return this.Item1.GetHashCode() + this.Item2.GetHashCode();
}

因此, distinct 不起作用的原因是因为被接受的 DTO 中的每个对象都有一个唯一的哈希码,这是不可见的。因此,考虑到这一点,我们的自定义比较器会比较对象中的值,然后组合哈希码并返回。

这为我们提供了具有唯一哈希码的不同值的列表。

【讨论】:

  • 如果您解决了自己的问题并希望分享知识,通常欢迎发布自我回答的问题。但所有其他 SO 规则仍然适用。稍微搜索一下,您就可以找到此类问题的数千个重复项。
  • 您的哈希值无效。当项目为空和零时,哈希使用对象引用作为标识,但等于运算符认为两个项目的值彼此相等。
  • “具有唯一的哈希码”?哈希码不是唯一的,这不是它的工作方式。如果两个项目具有不同的哈希码,Distinct 无需调用Equals 就知道它们不相等。但是如果它们具有相同的哈希码,则必须调用Equals 来确定它们是否相等。这就是为什么如果Equals 为两个项目返回true,那么GetHashCode 为这些项目返回相等 哈希值是绝对必要的。但这不是您的代码所做的(正如 Servy 的评论所描述的那样)。
猜你喜欢
  • 2019-10-22
  • 1970-01-01
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
相关资源
最近更新 更多