2010-12-03 13 views
0
IList<A_Desc,A_premium,B_Desc,B_Premium> 

はIソート2列A_Desc、A_premium ... A_Descに基づくことはできますか?IListを部分的にソートできますか?

そしてB_Descは、B_Premiumは

+0

4つの文字でコードサンプルをインデント、あなたのポストを書き換えてください。無効なHTMLのように見えるので、IListの完全な宣言は飲み込まれました。 –

+0

標準の 'IList'は' IList 'として宣言され、カラムはありません。 – Andrey

+0

その構文で 'IDictionary'を意味しますか? – Vishal

答えて

0

ファーストをオフにソートする前に同じ順序のままにすること聞かせては、リストは1種類のみとすることができ、あなたが実際に二つのリストをしたいとしてのみ、データの一つの「列」を持っています「desc」および「premium」を保持するデータ型。 "desc"は私にストリングのように聞こえる。私はプレミアムが何であるか分かりませんが、より良いアイデアがないためにdoubleとふりをします。私はこのデータが何を表しているのか分からないので、私にとってはちょっとしたことです。

、当然のことながら、getメソッドとsetメソッドを持つパブリックプロパティとして、私が代わりにdescとプレミアムはプライベートで持つべきクラス - 、およびDESCとプレミアムを定義する恐ろしい方法です
public class Thingie{ 
    public String desc; 
    public double premium; 
} 

。しかし、これは私がポイントを得るための最速の方法です。

それは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#では、IListにSortを実装する必要はありません.LinkedListの場合、非効率的な場合があります。それでは、ソート効率的に行いアレイに基づく新しいリストを、作りましょう、それを並べ替える:

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

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

関連する問題