2012-04-25 65 views
0

下面是一些我正在努力工作的代碼。如果一組中的項目與另一組中的項目不匹配,則將比較的所有項目添加到列表0中。如果最後列表中不包含除0以外的任何其他值,則意味着第二組中的項目根本不存在。出於某種原因,我在結果列表中不斷收到錯誤的值,所以肯定有某個地方有bug,只是我似乎無法找到它。使用IComparable比較對象的問題

public class CompareItem : IComparable 
    { 
     public string CustId { get; set; } 
     public string TechId { get; set; } 

     public CompareItem(string custId, string techId) 
     { 
      CustId = custId; 
      TechId = techId; 
     } 

     public int CompareTo(object obj) 
     { 
      CompareItem Temp = (CompareItem)obj; 
      if (this.CustId != Temp.CustId || this.TechId != Temp.TechId) 
      { 
       return 0; 
      } 
      else 
      { 
       return 1; 
      } 
     } 
    } 

    static void Main(string[] args) 
    { 
     List<CompareItem> LeftCompareSet = new List<CompareItem>(); 

     LeftCompareSet1.Add(new CompareItem("0000", "0001")); 
     LeftCompareSet1.Add(new CompareItem("0001", "0001")); 
     LeftCompareSet1.Add(new CompareItem("0002", "0002")); 
     LeftCompareSet1.Add(new CompareItem("0003", "0003")); 
     LeftCompareSet1.Add(new CompareItem("0002", "0004")); 

     List<CompareItem> RightCompareSet = new List<CompareItem>(); 

     RightCompareSet1.Add(new CompareItem("0005", "0005")); 
     RightCompareSet1.Add(new CompareItem("0004", "0004")); 
     RightCompareSet1.Add(new CompareItem("0003", "0003")); 
     RightCompareSet1.Add(new CompareItem("0002", "0002")); 
     RightCompareSet1.Add(new CompareItem("0006", "0002")); 

     int state = 0; 

     List<int> tlc = new List<int>(); 
     List<int> trc = new List<int>(); 

     foreach (CompareItem lc in LeftCompareSet) 
     { 
      foreach (CompareItem rc in RightCompareSet) 
      { 
       state = lc.CompareTo(rc); 
       if (state == 0) 
       { 
        tlc.Add(0); 
       } 
       else 
       { 
        tlc.Add(1); 
       } 
      } 

      if (tlc.Contains(1)) 
      { 
       Console.WriteLine("Cust: " + lc.CustId + ", Tech: " + lc.TechId + ", Not missing"); 
      } 
      else 
      { 
       Console.WriteLine("Cust: " + lc.CustId + ", Tech: " + lc.TechId + ", Missing"); 
      } 
     } 

     foreach (CompareItem rc in RightCompareSet) 
     { 
      foreach (CompareItem lc in LeftCompareSet) 
      { 
       state = rc.CompareTo(lc); 
       if (state == 0) 
       { 
        trc.Add(0); 
       } 
       else 
       { 
        trc.Add(1); 
       } 
      } 

      if (trc.Contains(1)) 
      { 
       Console.WriteLine("Cust: " + rc.CustId + ", Tech: " + rc.TechId + ", Not missing"); 
      } 
      else 
      { 
       Console.WriteLine("Cust: " + rc.CustId + ", Tech: " + rc.TechId + ", Missing"); 
      } 
     } 
    } 

回答

2

您的CompareTo是錯誤的。它應該返回0是兩個對象是相同的,-1如果一個比另一個小,1如果它更大。見here

+0

感謝您的支持。因此,如果對象匹配,則將return 1更改爲return 0,但如果對象不匹配,則必須返回一些內容,如果對象的屬性較大或較小,我不感興趣。對於不匹配的對象使用1似乎可行,但第二個列表中的最後一項除外,它表示它包含在第一個列表中,但情況並非如此。 – Willem 2012-04-25 12:13:04

+0

你應該重寫你的類的'Equals'和'GetHashCode',它更有意義。 – zmbq 2012-04-25 14:59:10

0

我覺得有幾個問題,在這種方法:

  1. 代碼中包含一個小錯誤:它必須是 LeftCompareSet而不是LeftCompareSet1

  2. 在的CompareTo你錯過檢查對象的類型,如果用錯誤的對象調用方法,則會得到異常。

  3. 我覺得你真正需要的是實現Equals方法: 公衆覆蓋布爾等於(obj對象) (不要忘記的GetHashCode)

  4. 不知道你真正想要什麼來實現的,可能是設置操作更有助於

  5. 你沒寫什麼是錯的結果,如果我執行你的代碼,我得到以下結果:

    • 卡斯特:0 000,技術:0001,缺少
    • 卡斯特:0001,技術:0001,缺少
    • 卡斯特:0002,技術:0002,不缺
    • 卡斯特:0003,技術:0003,不缺
    • 卡斯特: 0002科技:0004,不缺
    • 卡斯特:0005,技術:0005,缺少
0

你只是想確認,在第一列表中的項目是 在第二列表中存在?

如果我是對的,那麼你走了很長的路。 只是從一個列表採取一個項目,並檢查它是否存在第二列表上的與否

例如:

secondList.Exists(第一個[0]);

它會返回布爾值。

+0

據我所知,你的建議只適用於對象,而不適用於對象屬性。在這個例子中,它可能不是很明顯,但我也需要比較屬性值,因此只有部分不同的對象。 – Willem 2012-04-25 12:16:51

+0

是的,你是對的順便說一句BTW Cust:0002,Tech:0004,不會缺少<=這裏有問題嗎? – Red 2012-04-25 14:12:29