使用IComparable比较对象的问题

时间:2012-04-25 11:20:00

标签: c# object compare icomparable

这是我正在努力工作的一些代码。如果一组中的项目与另一组中的项目不匹配,则将0添加到所有项目的列表中。如果最后列表不包含除0以外的任何其他值,则表示第二组中的项目根本不存在于第二组中。由于某种原因,我一直在结果列表中得到错误的值,所以某处肯定存在错误,只是我似乎无法找到它。

    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");
            }
        }
    }

3 个答案:

答案 0 :(得分:2)

您的CompareTo错了。应该返回0是两个对象是相同的,如果一个小于另一个则为-1,如果它更大则为1。见here

答案 1 :(得分:0)

我认为这种方法存在几个问题:

  1. 代码包含一个小错误:必须是 LeftCompareSet而不是LeftCompareSet1

  2. 在CompareTo中,您错过了检查对象的类型,如果使用错误的对象调用该方法,则会出现异常。

  3. 我认为你真正需要的是实现Equals方法: public override bool Equals(object obj) (别忘了GetHashCode)

  4. 不确定您真正想要实现的目标,可能是设置操作更有帮助

  5. 您没有写出结果有什么问题,如果我执行您的代码,我会得到以下结果:

    • Cust:0000,Tech:0001,Missing
    • 客户:0001,技术:0001,失踪
    • Cust:0002,Tech:0002,Not Missing
    • Cust:0003,Tech:0003,Not Missing
    • Cust:0002,Tech:0004,Not Missing
    • 客户:0005,技术:0005,失踪

答案 2 :(得分:0)

您只想确认第一个列表中的项目是 存在于第二个列表中?

如果我是对的,那么你走了很长的路。 只需从一个列表中取出一个项目,然后检查它是否存在于第二个列表中

示例:

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

它将返回bool。