0
IList<A_Desc,A_premium,B_Desc,B_Premium>

A_Descに基づいて2つの列A_Desc、A_premium ...を並べ替えることはできますか?

そして、ソートする前に、B_Desc、B_Premiumを同じ順序のままにします

4

1 に答える 1

0

まず、リストは1つのタイプのみであり、データの「列」は1つしかないため、実際には2つのリストと「desc」と「premium」を保持するデータ型が必要です。「desc」は私には文字列のように聞こえます。プレミアムとは何かわかりませんがdouble、より良いアイデアが不足しているためだと思います。このデータが何を表しているのかわからないので、私にとっては、それはただのことです。

public class Thingie{
    public String desc;
    public double premium;
}

これはもちろん、クラスを定義するためのひどい方法です。代わりに、descとpremiumをプライベートにし、DescとPremiumをGetメソッドとSetメソッドを使用してパブリックプロパティとして使用する必要があります。しかし、これは私が要点を理解するための最速の方法です。

ThingieにIComparableを実装させ、それ自体を他のThingieオブジェクトと比較する方が標準的です。しかし、私は、カスタムタイプを作成する必要があることを知る前に書いた回答を編集しており、IComparableを実装するだけの自由がありました。これがIComparerのアプローチです。これを使用すると、C#に並べ替え方法を指示することで、自分自身を並べ替えないオブジェクトを並べ替えることができます。

カスタムタイプを操作するIComparerを実装します。

public class ThingieSorter: IComparer<Thingie>{
    public int Compare(Thingie t1, Thingie t2){
        int r = t1.desc.CompareTo(t2);
        if(r != 0){return r;}
        return t1.premium.CompareTo(t2);
    }
}

C#はSortを実装するためにIListを必要としません-LinkedListの場合は非効率的かもしれません。それでは、配列に基づいて効率的にソートする新しいリストを作成し、それをソートしてみましょう。

public List<Thingie> sortedOf(IList<Thingie> list){
    List<Thingie> ret = new List<Thingie>(list);
    ret.sort(new ThingieSorter());
    return ret;
}

List<Thingie>インターフェースを実装しているIList<Thingie>ので、元のリストを保持していて、魔法のようにソートされることを期待しているものがない限り、元のリストをこのリストに置き換えても何も壊れません。その場合は、コードをリファクタリングして、リストが並べ替えられるまで参照を取得しないようにします。これは、リストをその場で並べ替えることができないためです。

于 2010-12-03T18:53:45.163 に答える