リスト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便利ですよねー