2016-12-05 70 views
1

我有一個看起來像這樣的(不是我的表不能更改數據)數據表LINQ到獲得不同的屬性

Code  Version Description 
AAA  0.0.0.0 Test of AAA 
AAA  0.0.0.1 Test of AAA 
BBB  0.0.0.0 Test of BBB 
CCC  0.0.0.0 Test of CCC 
CCC  0.0.0.1 Test of CCC 

我想返回的獨特的「代碼」僅值的列表。
所以我期望的結果將是:

AAA Test of AAA 
BBB Test of BBB 
CCC Test of CCC 

我創建了一個比較器類:

public class MyComparer : IEqualityComparer<MY_DATA_TABLE> 
{ 
    public bool Equals(MY_DATA_TABLE x, MY_DATA_TABLE y) 
    { 
     return x.CODE == y.CODE; 
    } 

    public int GetHashCode(MY_DATA_TABLE obj) 
    { 
     return obj.GetHashCode(); 
    } 
} 

,並在我的代碼,我有:

var mapCodes = (from mtc in GetAllData() select mtc) 
        .Distinct(new MyComparer()) 
        .ToList(); 

但是它仍然返回整個內容都回來了。

我怎樣才能獲得一個清晰的財產清單?

+3

Unlikley來檢查代碼是你的問題,但你的GetHashCode的實現是不正確的。如果對象是「相等的」,那麼HashCodes應該匹配,所以你想'obj.Code.GetHashCode()' – BradleyDotNET

+2

*我如何通過屬性得到一個獨特的列表?**通過**正確**實現'GetHashCode'。 –

+0

你可能想要MoreLinq的DistinctBy擴展 –

回答

1

重寫你的GetHashCode()功能:

public int GetHashCode(MY_DATA_TABLE obj) 
{ 
    return obj.CODE.GetHashCode(); 
} 

規則是,雙方平等相待,GetHashCode()應檢查相同的屬性,而你只是在Equals()和whiole對象GetHashCode()

+0

就是這樣。我沒有意識到我沒有檢查房產。 – PrivateJoker

2

您可以使用MoreLinq's DistinctBy

var mapCodes = (from mtc in GetAllData() 
       select mtc).DistinctBy(x=>x.Code).ToList(); 

或者只是:

var mapCodes = GetAllData().DistinctBy(x=>x.Code).ToList(); 

或在評論

5

另一種選擇是通過做一組提到你可以糾正GetHashCode方法並且如果Version無關緊要,則取各組中的第一個值。

var mapCodes = (from mtc in GetAllData() 
       group mtc by mtc.Code into grp 
       select grp.First()).ToList(); 
+0

這是當然的正確答案 – Tuco