2012-04-25 60 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