2016-10-20 122 views
-1

我有兩個列表,一個是主數據,另一個是錯誤數據。所以現在我想比較這個列表,並將錯誤的匹配到正確的列表。如何比較兩個列表並將其與之匹配

public class Data 
{ 
    public int Id { get; set; } 
    public string Text{ get; set; } 
} 

var masterList = new List<Data> { new Data { id = 1, Text = "Hello" }, new Data() {id = 2, Text ="Ciao"} }; 
var wrongList = new List<Data> { new Data { id = 1, Text = "Ciao" }, new Data() {id = 2, Text ="Morning"} }; 

現在在masterList爲ID爲1的文字是「你好」,並在wrongList與ID爲1的文字是「僑」。

但id 2的文字有文字「你好」,所以我怎麼能匹配這兩個列表,當列表中有一個匹配,我得到正確的文本到正確的ID ...

如果文本匹配,那麼我將有一個新的列表如下:

ID = 2,文本=「僑」

我希望你明白我的問題!

感謝您的幫助......

+0

的期望是什麼在給定的例子 –

+0

我結果更新了我的問題 – user1861065

+0

該示例的預期輸出只是'masterList'的內容。甚至需要進行哪些比較? – David

回答

0

您可以輕鬆地與LINQ和Intersect,使Data實施IEquatable<Data>做到這一點。

var matches = masertList.Intersect(wrongList); 

UPDATE:根據意見,這裏是目前正在實施一個IEqualityComparer<Data>

class DataComparer : IEqualityComparer<Data> 
{ 
    // Datas are equal if their names and Id are equal. 
    public bool Equals(Data x, Data y) 
    { 
     if (ReferenceEquals(x, y)) 
      return true; 

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

     return x.Id == y.Id && x.Text == y.Text; 
    } 

    public int GetHashCode(Data data) 
    { 
     if (ReferenceEquals(product, null)) 
      return 0; 

     return (product.Name == null ? 0 : product.Name.GetHashCode())^product.Code.GetHashCode(); 
    } 
} 

和解決方案,你幾乎只需做:var matches = masertList.Intersect(wrongList, new DataComparer());

+0

與此我得到以下錯誤:枚舉沒有結果 – user1861065

+2

這是因爲類默認情況下使用_reference_相等。由於您的列表包含不同的對象(其中一些碰巧具有相同的屬性值),交集將爲空。 –

+2

@ user1861065'數據'需要根據您的需要實現'IEquatable '。或者你可以實現一個自定義的'IEqualityCompararer''並使用'Intersect'的相應超載。 – InBetween

相關問題