0

カスタム データ型の一意の要素のリストを取得しようとしています。なぜこれがうまくいかないのか、私は真剣に理解できませんでした。以下のコードでは、コントロールが Equals の実装に到達することはありません。誰かがこれを手伝ってくれませんか?

public class customobj : IEqualityComparer<customobj>
{
    public string str1;
    public string str2;

    public customobj(string s1, string s2)
    {
        this.str1 = s1; this.str2 = s2;
    }

    public bool Equals(customobj obj1, customobj obj2)
    {
        if ((obj1 == null) || (obj2 == null))
        {
            return false;
        }
        return ((obj1.str1.Equals(obj2.str1)) && (obj2.str2.Equals(obj2.str2)));

    }

    public int GetHashCode(customobj w)
    {
        if (w != null)
        {
            return ((w.str1.GetHashCode()) ^ (w.str2.GetHashCode()));
        }
        return 0;
    }
}

以下は、リストの個別の要素を取得しようとしている部分です。

List<customobj> templist = new List<customobj> { };

templist.Add(new customobj("10", "50"));
templist.Add(new customobj("10", "50"));
List<customobj> dist = templist.Distinct().ToList();
4

4 に答える 4

1

間違ったインターフェースを実装しています。あなたのクラスはIEqualityComparer<Rectangle>ではなく を実装していIEquatable<Rectangle>ます。toを渡さない限り、 (クラスが実装している場合) または のいずれかを使用します。IEqualityComparerDistinctIEquatable.EqualsObject.Equals

public class Rectangle : IEquatable<Rectangle>
{
    public string width;
    public string height;

    public Rectangle(string s1, string s2)
    {
        this.width = s1; this.height = s2;
    }

    `IEquatable.Equals
    public bool Equals(Rectangle obj2)
    {
        if (obj2 == null)
        {
            return false;
        }
        return ((this.width.Equals(obj2.width)) && (this.height.Equals(obj2.height)));

    }

    `override of object.Equals
    public override bool Equals(Object(o2)
    {
       if(typeof(o2) == typeof(Rectangle))
           return ((Rectangle)this.Equals((Rectangle)o2);

       return false;
    } 

    'override of object.GetHashCode
    public override int GetHashCode()
    {
        return ((this.width.GetHashCode()) ^ (thisw.height.GetHashCode()));
    }
}

widthまた、 andheightstring数値型ではなく s である特定の理由はありますか? "100"これは非常に奇妙に思えます。実際にはと"0100"とが等しいと仮定するなどの奇妙なバグにつながる可能性が" 100 "あります。実際にはそれらは別個の文字列であり、異なるハッシュ コードを持ちます。

于 2013-04-01T13:28:05.017 に答える
1

Rectangle のクラスに IEqualityComparer を実装する場合は、次のように記述します。

List<Rectangle> dist = templist.Distinct(new Reclangle("","")).ToList();

通常、RectangleComparer クラスを介して実装されます。

class RectangleComparer : IEqualityComparer<Rectangle>
{
   public static IEqualityComparer<Rectangle> Instance { get {...} }
...
}

List<Rectangle> dist = templist.Distinct(RectangleComparer.Instance).ToList();

または、GetHashCode と Equals をオーバーライドします =)

于 2013-04-01T13:25:23.117 に答える