如何检查List <model>中的重复项

时间:2016-11-09 00:23:04

标签: c# arrays linq group-by

我有一个模特:

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表,并循环遍历行以创建一个List,然后我将保存到db。

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

我知道一个列表我可以做类似的事情:

  var hasDuplicates = MyList.GroupBy(x => x.num).Any(x => x.Count() > 1);
如果列表中有重复项,

和hasDuplicate将为true。我不确定如何在需要比较的情况下执行此操作。每组坐标应该是一组但不确定如何组合一组。我可以在sql中做到这一点,但是我必须在它到达db之前抓住它。

2 个答案:

答案 0 :(得分:3)

以下是这样的 - 您可以通过在GroupBy中创建匿名类型来两个属性进行分组:

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

答案 1 :(得分:0)

另一个解决方案是实现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());