-1

IComparable( 、IComparerIEquatableIEnumerable)などの標準の c# インターフェイスを明示的に実装する必要がありますIEnumerator。私はそれを正しくやっていますか?

 class Lemon : IComparable
    {
        public String name { get; set; }

        public int id { get; set; }
        public Lemon (String name, int id)
        {
            this.name = name;
            this.id = id;
        }

        int IComparable.CompareTo(object obj)
        {
            Lemon other = (Lemon)obj;
            if (this.id > other.id)
                return 1;
            else if (this.id < other.id)
                return -1;
            else return 0;
        }

        public void diamond ()
        {
            Console.WriteLine();
        }

        public override string ToString()
        {
            return this.name + " " + this.id;
        }
    }

そして今メイン:

static void Main(string[] args)
        {
            List<IComparable> icL = new List<IComparable>();
            IComparable temp = new Lemon("Git", 99);
            icL.Add(temp);
            icL.Add(new Lemon("Green", 9));
            icL.Add(new Lemon("Don", 7));
            icL.Add(new Lemon("Simon", 12));

            icL.Sort();

            foreach (IComparable itm in icL)
            {
                Console.WriteLine(itm.ToString());
            }


            Console.WriteLine("----------");

        }

それで、あなたはどう思いますか?

もう 1 つの問題は、コレクションを繰り返し処理しているときに、メソッド diamond にどのようにアクセスできるかということです。

4

1 に答える 1

1

これに対する唯一の答えはありません。ただし、実装に匹敵する型には役立ちますIComparable<T>。これは通常、単一の実装を共有する場合です。

    int IComparable<Lemon>.CompareTo(Lemon obj) {
        return CompareTo(obj);
    }
    int IComparable.CompareTo(object obj) {
        return CompareTo(obj as Lemon);
    }
    private int CompareTo(Lemon obj) {
        return obj == null ? -1 : (this.id - obj.id);
    }

IEnumerable/の実装IEnumerator非常に異なることに注意してください。通常は、カプセル化されたオブジェクトのイテレータを返すか、イテレータ ブロックを記述することによって行われます。イテレータをゼロから手動で作成することは非常にまれです。

を実装する場合は、とすべてが一致する実装を持っているIEquatable<T>ことを確認する必要があります。2 つのメソッドの場合は、両方から呼び出す単一のメソッドを使用することで、これを行うことができます。object.Equalsobject.GetHashCodeIEquatable<T>.EqualsEquals

リストはList<Lemon>;になる可能性があります。それでも正しくソートされるはずです。これにより、次のようなメソッドへのアクセスも簡単になりますdiamond()

var icL = new List<Lemon>();
// ...
foreach (var item in icL) {
    item.diamond();                
    Console.WriteLine(item.ToString());
}
于 2014-10-14T18:26:46.280 に答える