2017-06-30 10 views
1

私は2つのリストを持って、彼らはこのC#List1.Union(LIST2) - カスタム比較

list1ように見える今、私はそれらをマージしたい

CMD=stopped|ID=2222|TS=2017-06-30 8:19:20|AUF=4711|AG=010|Res=saguasgha|Mail=true|; 
CMD=stopped|ID=6666|TS=2017-06-30 8:19:20|AUF=4711|AG=010|Res=saguasgha|Mail=true|; 

が含まれてい

CMD=stopped|ID=1234|TS=2017-06-30 7:19:20|AUF=4711|AG=010|; 
CMD=stopped|ID=1111|TS=2017-06-30 7:19:20|AUF=4711|AG=010|; 
CMD=stopped|ID=2222|TS=2017-06-30 7:19:20|AUF=4711|AG=010|; 
CMD=stopped|ID=3333|TS=2017-06-30 7:19:20|AUF=4711|AG=010|; 
CMD=stopped|ID=4444|TS=2017-06-30 7:19:20|AUF=4711|AG=010|; 
CMD=stopped|ID=5555|TS=2017-06-30 7:19:20|AUF=4711|AG=010|; 

list2が含まれていますIDのList3という新しいリストに追加します。 LIST2はそうList3の予想結果がこれです、同じIDでのList1のentrysを交換する必要があります。

CMD=stopped|ID=1234|TS=2017-06-30 7:19:20|AUF=4711|AG=010|; 
CMD=stopped|ID=1111|TS=2017-06-30 7:19:20|AUF=4711|AG=010|; 
CMD=stopped|ID=2222|TS=2017-06-30 8:19:20|AUF=4711|AG=010|Res=saguasgha|Mail=true|; 
CMD=stopped|ID=3333|TS=2017-06-30 7:19:20|AUF=4711|AG=010|; 
CMD=stopped|ID=4444|TS=2017-06-30 7:19:20|AUF=4711|AG=010|; 
CMD=stopped|ID=5555|TS=2017-06-30 7:19:20|AUF=4711|AG=010|; 
CMD=stopped|ID=6666|TS=2017-06-30 8:19:20|AUF=4711|AG=010|Res=saguasgha|Mail=true|; 

私はList.Union方法でこれを達成できる知っているが、これはハッシュコードを使用すると文字列が異なっていて、そのないので、ワーキング。だから、私はちょうどIDの比較を必要とする - 文字列の "属性"、それ以上はない。

私はGetHashCode()Equals()をオーバーライドしなければならないと思いますが、私の目標を達成する方法はわかりません。

提案がありますか?

ありがとうございます!

は(IDを抽出するために、私はそのRegExExtraction("ID=",line)と呼ばれる指定した文字列からID-値を返すメソッドを持っている)

// EDIT:あなたのアドバイスのための

おかげで、今それをやりましたこのように:

 public class MyComparer : IEqualityComparer<string> 
     { 
      public bool Equals(string line1, string line2) 
      { 
       return RegExExtraction("ID=", line1) == RegExExtraction("ID=", line2); 
      } 


      public int GetHashCode(string obj) 
      { 
       return RegExExtraction("ID=", obj).GetHashCode(); 
      } 

      private string RegExExtraction(string value, string toCheck) 
      { 
       return Regex.Match(toCheck, string.Format("{0}({1}){2}", Regex.Escape(value), ".+?", Regex.Escape("|"))).Groups[1].Value; 
      } 
     } 
newList = list2.Union(list1, new MyComparer()).ToList(); 
+0

[Concat]、[groupby] id –

+0

[Equals()およびOperator ==]をオーバーライドするためのガイドライン(https://msdn.microsoft.com/en-us/library/ms173147(VS.90) .aspx) –

答えて

1

あなたはIEqualityComparer<>(とあなたの文字列の各値のプロパティを持っているかもしれないクラス経由で)自分自身を記述する必要があります。されたIEqualityComparerあなたが呼び出すことができることを持つことにより

var distinctValues = new HashSet<MyClass>(list1.Concat(list2), MyClassEqualityComparer.Default); 

そしてEquals()GetHashCode()上書きしないでください。 IEqualityComparer<>という独自の実装を常に好み、特別な比較が必要な場所でこれを使用します。等価比較を使用するほぼすべてのクラスまたはメソッドには、引数としてIEqualityComparerを取るオーバーロードがあります。

+0

あなたのアドバイスをいただき、ありがとうございました –

関連する問題