2

オブジェクトの汎用リストをソートする正しい方法を見つけようとしています。私のデータ構造の簡単な例:

// The base class
public abstract class Item : IComparable<Item> {
    public enum Category { Hats, Shirts, ... }
    public Category category;

    public int CompareTo (Item that) {
       ...
    }
}

// One of several classes extending Item
public class Hat : Item {
    public int CompareTo (Hat that) {
       ...
    }
}

Item を拡張する各クラスのリストを維持するマネージャー クラスがあります。

Dictionary<Item.Category, List<Item>> _items;

...

foreach (Item.Category category in Enum.GetValues(typeof(Item.Category))) {
    List<Item> list = _items[category];
    list.Sort();
}

私が抱えている問題は、 を呼び出すときにList<Item>.Sort()、明らかにクラス固有のCompareTo()関数を利用していないことです。これにアプローチする適切な方法は何ですか?

4

2 に答える 2

1

問題は、派生クラスが実装していない実装List<Item>.Sort()を探していることです。たまたま同じ名前を持っている以外は、実装とは関係のないメソッドをIComparable<Item>追加しました。仮想にしてオーバーロードすることもできますが、オーバーライドの署名を変更する必要があります。CompareTo(Hat hat)IComparable<Item>CompareTo

// The base class
public abstract class Item : IComparable<Item> {
    public enum Category { Hats, Shirts, ... }
    public Category category;

    public virtual int CompareTo (Item that) {
       // default implementation
    }
}

// One of several classes extending Item
public class Hat : Item {
    public override int CompareTo (Item that) {
       // override for Hats - can Hats be compared to other Items?
    }
}

また、 CompareTo が対称的推移的であることも十分注意してください。そうしないと、並べ替えが失敗します。

対称 : a < b then b > a の場合

他動詞: a < b かつ b < c の場合、a < c

その実装はCompareTo推移的ではなく、診断と修正が難しいものを見てきました。

また、時間をかけてEquals と比較演算子をオーバーライドする必要があります

于 2013-05-23T03:11:49.283 に答える
0

C# に付属している組み込みの比較を使用できない理由はありますか?

list.OrderByDescending(..)またlist.OrderBy(..)

使用することを選択したい場合Icomparableは、何を比較するかを指定する必要があります。

list.Sort((x,y) => x.Category.CompareTo(y.Category));
于 2013-05-23T02:19:54.937 に答える