2013-04-15 2 views
0

5 개의 특성을 가진 오브젝트를 작성하려고하며 각 특성에는 2 개의 속성이 있습니다. 그런 다음, 객체가 동일한 경우 객체를 비교합니다. 동일한 범주로 그룹화됩니다. 여기 오브젝트 (복수 레벨)의 비교

코드이다

Item.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 (부호화를 테스트하는 메인 클래스)

objB (SortPropc)하지만 false를 반환 사이 동일한 특성이 있기 때문에 0
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(); 
    } 
    } 

true 결과를 반환한다.

저는 논리 부분을 놓치고 4 시간 동안 의자에 앉아 있지만 그것을 고칠 수는 없다고 생각합니다. 누구든지 그것을 해결할 수 있습니까?

답변

0

objA와 objB (SortPropc)간에 동일한 속성이 있지만 false를 반환하므로 결과가 true를 반환해야합니다.

방금 ​​구현하지 않았습니다. 코드를 다시 읽고 두 개의 Item 인스턴스를 실제로 비교하는 부분을 찾으십시오. 아무도 없습니다.

당신은, 당신의 Item 클래스에서이 같은 EqualsGetHashCode 메소드를 구현해야합니다

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>를 구현하는 클래스를 만듭니다.

+0

나에게 길을 보여줄 수 있습니까? :) –

+0

이미 내 대답에 코드 샘플을 포함시키지 않았습니까? :-) – sloth

+0

예, 완료되지 않았습니다. ( –