0

ここに私が働こうとしているいくつかのコードがあります。1 つのセットのアイテムが他のセットのアイテムと一致しない場合、比較されたすべてのアイテムのリストに 0 が追加されます。最終的にリストに 0 以外の値が含まれていない場合は、最初のセットの項目が 2 番目のセットにまったく存在しないことを意味します。なんらかの理由で、結果のリストに間違った値が表示され続けるので、どこかにバグがあるはずです。それを見つけることができないだけです。

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

3 に答える 3

2

あなたCompareToは間違っています。2 つのオブジェクトが同じである場合は 0 を返し、一方が他方よりも小さい場合は -1 を返し、大きい場合は 1 を返します。こちらをご覧ください

于 2012-04-25T11:26:02.337 に答える
0

このアプローチにはいくつかの問題があると思います。

  1. コードに小さな間違いが含まれています:LeftCompareSet1ではなくLeftCompareSetである必要があります

  2. CompareToでは、オブジェクトのタイプを確認できません。メソッドが間違ったオブジェクトで呼び出された場合、例外が発生します。

  3. 本当に必要なのは、Equalsメソッドを実装することだと思います。publicoverride bool Equals(object obj)(GetHashCodeを忘れないでください)

  4. 本当に何を達成したいのかわからない場合は、設定操作の方が役立つ可能性があります

  5. 結果の何が悪いのかを書かなかったので、コードを実行すると、次の結果が得られます。

    • Cust:0000、Tech:0001、Missing
    • Cust:0001、Tech:0001、Missing
    • Cust:0002、Tech:0002、欠落していない
    • Cust:0003、Tech:0003、欠落していない
    • Cust:0002、Tech:0004、欠落していない
    • Cust:0005、Tech:0005、Missing
于 2012-04-25T11:43:26.767 に答える
0

最初のリストのアイテムが2番目のリストに存在することを確認したいだけですか?

私が正しければ、あなたは長い道のりを歩んだことになります。1 つのリストから項目を取得し、2 番目のリストに存在するかどうかを確認するだけです

例 :

secondList.Exists (最初の [0]);

ブールを返します。

于 2012-04-25T11:48:52.603 に答える