0

EqualityComparer と Intersect の実装方法を誤解しています。c# と linq を使用してセットを理解したいのですが、以下のコードでは結果が得られません。これは私のコードです

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{



public class objTest : EqualityComparer<objTest>
{
    public int index { get; set; }
    public string name { get; set; }

    public override  bool Equals(objTest x, objTest y)
    {
        return x.index == y.index;

    }
    public override int GetHashCode(objTest obj)
    {

        return obj.index.GetHashCode();
    }


}
 static void Main(string[] args)
{

    List<objTest> L1 = new List<objTest>();
    L1.Add(new objTest { index = 1, name = "ALAN" });
    L1.Add(new objTest { index = 2, name = "bill" });
    L1.Add(new objTest { index = 3, name = "clive" });
    L1.Add(new objTest { index = 4, name = "dave" });
    L1.Add(new objTest { index = 5, name = "ewan" });

    List<objTest> L2 = new List<objTest>();
    L2.Add(new objTest { index = 11, name = "ALAN" });
    L2.Add(new objTest { index = 12, name = "bill" });
    L2.Add(new objTest { index = 13, name = "clive" });
    L2.Add(new objTest { index = 14, name = "dave" });
    L2.Add(new objTest { index = 1, name = "ALAN2" });
    //THIS HAS NO RESULTS
    var L3 = L1.Intersect(L2);

}
}

L3に結果がない理由を誰か教えてもらえますか?

4

3 に答える 3

1

外部比較を使用したい場合は、mrtig が回答しています。

objTestインスタンス同士を比較したいEquals場合: 間違ったand をオーバーライドしていますGetHashCodeEquals1 つのパラメータを取り、それを と比較する をオーバーライドする必要がありますthis。を実装するべきではありませんEqualityComparer

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    public class objTest
    {
        public int index { get; set; }
        public string name { get; set; }

        public override bool Equals(object other)
        {
            objTest o = other as objTest;
            return o != null && o.index == index;
        }
        public override int GetHashCode()
        {
            return index.GetHashCode();
        }
    }
    static void Main(string[] args)
    {
        List<objTest> L1 = new List<objTest>();
        L1.Add(new objTest { index = 1, name = "ALAN" });
        L1.Add(new objTest { index = 2, name = "bill" });
        L1.Add(new objTest { index = 3, name = "clive" });
        L1.Add(new objTest { index = 4, name = "dave" });
        L1.Add(new objTest { index = 5, name = "ewan" });

        List<objTest> L2 = new List<objTest>();
        L2.Add(new objTest { index = 11, name = "ALAN" });
        L2.Add(new objTest { index = 12, name = "bill" });
        L2.Add(new objTest { index = 13, name = "clive" });
        L2.Add(new objTest { index = 14, name = "dave" });
        L2.Add(new objTest { index = 1, name = "ALAN2" });
        //THIS HAS NO RESULTS
        var L3 = L1.Intersect(L2);
    }
}
于 2013-10-02T16:39:58.537 に答える
1

IEqualityComparerで実装するクラスのインスタンスを参照する必要がありますIntersect。そのようです:

        public class objTest 
        {
            public int index { get; set; }
            public string name { get; set; }
        }

        class eqcomp : EqualityComparer<objTest>
        {
            public override bool Equals(objTest x, objTest y)
            {
                return x.index == y.index;

            }
            public override int GetHashCode(objTest obj)
            {

                return obj.index.GetHashCode();
            }


        }

        static void Main(string[] args)
        {
            List<objTest> L1 = new List<objTest>();
            L1.Add(new objTest { index = 1, name = "ALAN" });
            L1.Add(new objTest { index = 2, name = "bill" });
            L1.Add(new objTest { index = 3, name = "clive" });
            L1.Add(new objTest { index = 4, name = "dave" });
            L1.Add(new objTest { index = 5, name = "ewan" });

            List<objTest> L2 = new List<objTest>();
            L2.Add(new objTest { index = 11, name = "ALAN" });
            L2.Add(new objTest { index = 12, name = "bill" });
            L2.Add(new objTest { index = 13, name = "clive" });
            L2.Add(new objTest { index = 14, name = "dave" });
            L2.Add(new objTest { index = 1, name = "ALAN2" });
            //THIS HAS RESULTS :)
            var L3 = L1.Intersect(L2, new eqcomp());
     }
}
于 2013-10-02T16:40:34.507 に答える