2016-11-09 29 views
1

我有一個模型:如何重複檢查的列表<Model>

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

我目前:

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

的用戶將從一個Excel工作表,將看起來像載一個列表上傳Excel表格,然後遍歷行來創建一個List,然後我將保存到數據庫。

我必須能夠捕獲重複行,就像最後2行具有相同座標(2,1)。

我知道一個列表,我可以這樣做:

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

,如果有列表中的重複hasDuplicate將是真實的。我不知道如何在需要比較的情況下做到這一點。每組座標應該是一個組,但不知道如何按組進行分組。我可以在sql中完成,但是我必須在它到達db之前捕獲它。

+0

您可以覆蓋** MyModel.Equals **方法。 –

回答

3

下面是如何 - 你可以按性能通過創建GroupBy內的匿名類型:

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

此外,可能Distinct()將工作得很好 –

+0

好的想法,但實際上不會工作,除非邏輯重複實際上是對*相同*對象的引用 - 他們幾乎肯定不會引用OP中的同一個對象。理論上你可以構建一個'IEqualityComparer'並將其傳遞給'Distinct'調用(其中一個覆蓋),以指定如果兩列完全相同,那麼'MyModel'等於另一個,但當這個'GroupBy '選項可用。 –

+0

這樣做的竅門,雖然我不得不稍微修改它。此版本運行但返回不正確的結果。我刪除了組中的分配,並且工作:MyList.GroupBy(x => new {x.GridX,x.GridY})。Any(x => x.Count()> 1);如果有人能告訴我這個區別,我很有興趣知道。謝謝。 – BattlFrog

0

Aother解決方案是實現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());

+0

在GetHashCode中,您錯過了GridX和GridY的'product'。 – kurakura88