如何检查List中的重复项
本文关键字:Model 何检查 检查 List | 更新日期: 2023-09-27 18:16:57
我有一个模型:
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,1)的最后2行。
我知道对于单个列表我可以这样做:
var hasDuplicates = MyList.GroupBy(x => x.num).Any(x => x.Count() > 1);
如果列表中有重复项,和hasDuplicate将为true。我不确定在有需要比较的对的情况下如何做到这一点。每一组坐标应该是一个组,但不确定如何按一个集合分组。我可以在sql中这样做,但唉,我必须在它到达db之前捕获它。
如何通过在GroupBy
:
MyList.GroupBy(x => new { GridX = x.GridX, GridY = x.GridY }).Any(x => x.Count() > 1);
另一个解决方案是实现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());