0

5 つのプロパティを持つオブジェクトを作成したいのですが、各プロパティには 2 つの属性があります。その後、オブジェクトが同じであれば比較し、同じカテゴリにグループ化します。

コードは次のとおりです。

アイテム.cs

public class Item
{
    public Item()
    {
    }

    public SortProperty SortPropA { get; set; }
    public SortProperty SortPropB { get; set; }
    public SortProperty SortPropC { get; set; }
    public SortProperty SortPropD { get; set; }
    public SortProperty SortPropE { get; set; }

    public string Name { get; set; }
    public string Desc { get; set; }
}

SortProperty.cs

public class SortProperty : IEquatable<SortProperty>
{
    public string PartName { get; set; }
    public string GroupabilityID { get; set; }

    public SortProperty()
    {
    }

    public override int GetHashCode()
    {
        int hash = 19;
        hash = hash * 31 + (GroupabilityID == null ? 0 : GroupabilityID.GetHashCode());
        hash = hash * 31 + (PartName == null ? 0 : PartName.GetHashCode());
        return hash;
    }

    public bool Equals(SortProperty obj)
    {
        return (obj == null) ?
           false : (GroupabilityID == obj.GroupabilityID) || (PartName == obj.PartName);
    }

    public override bool Equals(Object obj)
    {
        SortProperty itemobj = obj as SortProperty;
        return itemobj == null ? false : Equals(itemobj);
    }

}

Program.cs (コーディングをテストするメイン クラス)

class Program
{
    static void Main(string[] args)
    {
        Item objA = new Item();
        Item objB = new Item();

        // ------ Object A
        objA.Name = "Card1";
        objA.Desc = "Product Test A";
        //Property A
        objA.SortPropA = new SortProperty();
        objA.SortPropA.PartName = "Plastic A";
        objA.SortPropA.GroupabilityID = "A1";
        //Property B
        objA.SortPropB = new SortProperty();
        objA.SortPropB.PartName = "Color Green";
        objA.SortPropB.GroupabilityID = "B2";
        //Property C
        objA.SortPropC = new SortProperty();
        objA.SortPropC.PartName = "Visa";
        objA.SortPropC.GroupabilityID = "C1";

        // ------ Object B
        objB.Name = "Card2";
        objB.Desc = "Product Test B";
        //Property A
        objB.SortPropA = new SortProperty();
        objB.SortPropA.PartName = "Plastic B";
        objB.SortPropA.GroupabilityID = "A2";
        //Property B
        objB.SortPropB = new SortProperty();
        objB.SortPropB.PartName = "Color Lime";
        objB.SortPropB.GroupabilityID = "B1";
        //Property C
        objB.SortPropC = new SortProperty();
        objB.SortPropC.PartName = "Visa";
        objB.SortPropC.GroupabilityID = "C1";

        bool isEqual = objA.Equals(objB);

        if (isEqual == true)
            Console.WriteLine("Is same");
        else
            Console.WriteLine("Is different");

        Console.ReadKey();
    }
    }

と(SortPropc)trueの間に同じプロパティがあるため、結果が返されるはずですが、 が返されます。objAobjBfalse

論理的な部分が欠けていると思います.4時間椅子に座っていましたが、修正できませんでした. どなたか解いて頂けないでしょうか?

4

1 に答える 1

0

objA と objB (SortPropc) の間に同じプロパティがあるため、結果は true を返すはずですが、false を返します。

あなたはそれを実装していません。Itemコードをもう一度読んで、実際に 2 つのインスタンスを比較する箇所を見つけてください。ありません。

次のように、クラスにEqualsandGetHashCodeメソッドを実装する必要があります。Item

public override bool Equals(Object obj)
{
    var o = (Item)obj;
    // Note: not error checking :-)
    return SortPropA.Equals(o.SortPropA) || 
           SortPropB.Equals(o.SortPropB) || 
           SortPropC.Equals(o.SortPropC) || 
           SortPropD.Equals(o.SortPropD) || 
           SortPropE.Equals(o.SortPropE);
}

IEqualityComparer<Item>または、この要件を処理する実装クラスを作成します。

于 2013-04-15T09:25:43.877 に答える