2012-04-03 9 views
0

他の2つのリストに基づいて1つのリストを作成する必要があります。しかし、それは重複を削除しないようです。ダブを使用しない2つのリストの結合

このように効率的に2つのリストを二重ではなくマージする方法はありますか?

List<String[]> blocksComparisonSet1 = new List<String[]>(); 
List<String[]> blocksComparisonSet2 = new List<String[]>(); 
//we will combine list1 and list2 into this one 
List<String[]> blocksComparisonFinal = new List<String[]>(); 

//this is how I store data in each list 
//if both values found, add both of them (partial functions, FYI) 
String[] NA = new String[2]; //keep results 
NA[0] = baseLine; //[0] for base 
NA[1] = resultLine; //[1] for result 
blocksComparisonSet1.Add(NA); 

//if only one value found 
String[] NA = new String[2]; //keep results 
NA[0] = ""; //[0] for base 
NA[1] = resultLine; //[1] for result 
blocksComparisonSet1.Add(NA); 

//This is where I merge lists and try to remove duplicates 
if (blocksComparisonSet1.Count() > 0 || blocksComparisonSet2.Count() > 0) 
//check if we have any values in out differences lists. if we do, merge them 
{ 
    blocksComparisonFinal.AddRange(blocksComparisonSet1); 
    //add records from one list to final list 
    blocksComparisonFinal.AddRange(blocksComparisonSet2); 
    //add records from second list to final list 
    blocksComparisonFinal = blocksComparisonFinal.Distinct().ToList(); 
    //remove dublicates 
} 

-

List1[] Example  
string1 na 
string2 na 
string3 String1 
string4 String7 
string5 string8 
na string9 
na string2 

-

List2[] Example  
na string2 
na string5 
String1 string3 
String7 string4 
string8 string5 
string9 na 
string2 na 

-

Final List[] must be: 
na string9 
na string2 
na string5 
string1 na 
String1 string3 
string2 na 
string3 String1 
string4 String7 
string5 string8 
String7 string4 
string8 string5 
string9 na 
+3

の実装で代替の非LINQのソリューションは、' Count'を使用しないでください:

ここに1つの実装です。 – jason

答えて

2

IEqualityComparer<string[]>

var merged = new HashSet<string[]>(blocksComparisonSet1, new SEC()); 
merged.UnionWith(blocksComparisonSet2); 

class SEC : IEqualityComparer<string[]> 
{ 
    public bool Equals(string[] p1, string[] p2){ 
     return p1.SequenceEqual(p2); 
    } 
    public int GetHashCode(string[] p){ 
     return (int)p.Sum (p1 => p1.GetHashCode()); 
    } 
} 
+0

気をつけろ!配列内にnullの 'string'参照がある可能性があります。 – jason

+0

さて、私はあなたをコピーします:) – Phil

6
var merge = blocksComparisonSet1.Union(
       blocksComparisonSet2, 
       new ArrayEqualityComparer<string>() 
      ).ToList(); 

カスタムが必要になりますIEqualityComparer<string[]>MSDNを参照してください。あなたは `Any`を意味する場合

class ArrayEqualityComparer<T> : IEqualityComparer<T[]> { 
    public bool Equals(T[] x, T[] y) { 
     if(Object.ReferenceEquals(x, y)) { 
      return true; 
     } 
     if(x == null || y == null) { 
      return false; 
     } 
     return x.SequenceEqual(y); 
    } 

    public int GetHashCode(T[] x) { 
     if(x == null) { 
      return 0; 
     } 
     return x.Aggregate(
      0, 
      (h, item) => h^(item != null ? item.GetHashCode() : 0) 
     ); 
    } 
} 
+0

はい、あなたは間違いなくIEqualityComparer の実装が必要です。あなたのコードはスタンドとしては機能しません。 – Phil

関連する問題