リストAと、リストBを比較してリストAに含まれない要素の取り出し
2.0.42.8から市場の差分を通知する機能をつけました。
その中であらたに勉強できた方法をご紹介します。
たとえば
Aが{ねこ、いぬ、うさぎ、のびた、えび、もなか、にしん}でBが{あんず、うさぎ、なす、えびせん、もなか、にしん、するめ}だった時に、{あんず、なす、えびせん、するめ}を求めたい場合
var q1 = B.Intersect(A);
var q2 = B.Except(q1);
とすればq2の結果がその求めたいリストになります。
これは、リストが int だけとか、stringだけの単一のリストで、クラスだった場合うまく動きません。
いろいろ調べていく中でComparerというものを定義しないといけないってことをしりました。
public class ichibaItem { public string Code; public string Title; public ichibaItem(string code, string title) { this.Code = code; this.Title = title; } }
このクラスで、codeで選別したい場合
public class IchibaComparer : EqualityComparer<ichibaItem> { public override bool Equals(ichibaItem x, ichibaItem y) { if (object.Equals(x, y)) return true; if (x == null || y == null) return false; return (x.Code == y.Code); } public override int GetHashCode(ichibaItem obj) { return obj.Code.GetHashCode(); } }
こういう感じで定義しておきます。
使うときはこういう感じでComparerを指定してあげます。
var q1 = B.Intersect(A,new IchibaComparer()); var q2 = B.Except(q1,new IchibaComparer());
linq便利ですよねー