【问题标题】:How do I check for duplicates in a List<Model>如何检查 List<Model> 中的重复项
【发布时间】:2016-11-09 00:23:04
【问题描述】:

我有一个模型:

public class MyModel
{
    public int GridX { get; set; }
    public int GridY { get; set; }
}

用户将从 Excel 工作表中上传一个类似于以下内容的列表:

GridX       GridY
  1           3
  1           2
  1           4
  2           2
  2           1
  2           1

我目前上传了 excel 表,并遍历行以创建一个列表,然后我将其保存到数据库中。

我必须能够捕获重复的行,例如最后 2 行具有相同坐标 (2,1)。

我知道对于一个列表,我可以执行以下操作:

  var hasDuplicates = MyList.GroupBy(x => x.num).Any(x => x.Count() > 1);

如果列表中有重复项,则 hasDuplicate 将为真。如果有需要比较的对,我不确定如何执行此操作。每组坐标应该是一个组,但不确定如何按一组进行分组。我可以在 sql 中做到这一点,但可惜我必须在它到达 db 之前捕获它。

【问题讨论】:

  • 您可以覆盖 MyModel.Equals 方法。

标签: c# arrays linq group-by


【解决方案1】:

方法如下 - 您可以通过在 GroupBy 中创建匿名类型来按 两个 属性进行分组:

MyList.GroupBy(x => new { GridX = x.GridX, GridY = x.GridY }).Any(x => x.Count() > 1);

【讨论】:

  • 好主意,但这实际上是行不通的,除非逻辑重复实际上是对 same 对象的引用——它们几乎肯定不会引用 OP 中的同一对象案子。理论上,您可以构建一个 IEqualityComparer 并将其传递给 Distinct 调用(覆盖之一)以指定 MyModel 如果两列相同则等于另一个,但是当这 @987654326 @ 选项可用。
  • 这成功了,虽然我不得不稍微修改一下。此版本运行但返回错误结果。我删除了组中的分配并且有效: MyList.GroupBy(x => new { x.GridX, x.GridY }).Any(x => x.Count() > 1);如果有人能告诉我区别,我很想知道。谢谢。
【解决方案2】:

另一种解决方案是实现 MyModelComparer 并使用 Distinct

class MyModelComparer : IEqualityComparer<MyModel>
{
    public bool Equals(MyModel x, MyModel y)
    {
        if (Object.ReferenceEquals(x, y)) return true;

        if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
            return false;

        return x.GridX == y.GridX && x.GridY == y.GridY;
    }

    // If Equals() returns true for a pair of objects 
    // then GetHashCode() must return the same value for these objects.

    public int GetHashCode(MyModel model)
    {
        return (model.GridX.GetHashCode()*397)^model.GridY.GetHashCode
    }

}

然后使用 Distinct var result = MyList.Distinct(new MyModelComparer());

【讨论】:

  • 在 GetHashCode 中,您错过了 GridX 和 GridY 的 product
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 2016-03-20
  • 2017-09-30
  • 2019-06-27
相关资源
最近更新 更多