2009-07-02 3 views
7

誰もが..私は私がする必要があるので、リスト<>を別のリスト(C#)に保存されている私のカスタムオーダで並べ替える?

IList<itemTp> itemTps; 

itemTpは基本的にクラスであるような一般的なリストは、(プロパティの数を持っている)、この上の一つの特性は、「コード」

で持って助けることができます私は別のリストに設定した特定の順序をソートすることができます。

このリストは次のように言う(最初から最後まで始まる)順番を示していますシンプルなリストである

CODE1 CODE3 コード2 CODE5 (それは2〜5に1から3に行くに気づく - これらは重要なことは数字ですが、数字とは関係ありません)

基本的に私はitemTpの項目を他のリストにあるものに従って確実に並べる必要があります...

So私のIListこのCODE1、CODE2、CODE3、CODE5のようなものであると想像 - ソートが行われた後、私の

 IList<itemTp> 

で は順序である4つのクラスが含まれているとCODE1、CODE3、CODE2、CODE5のような性質を持つことになりますので、 (注文変更)

どのようにこれを行うには?何かが間違っている場合

答えて

9

他のリストの状態に基づいてアイテムを比較するIComparerを作成する必要があります。 IComparerを使用する利点は、最適化が必要な場合にIndexOf()ルックアップを繰り返さないように、クラスにキャッシュロジックを構築できることです。また、必要に応じて使用できる複数の「その他の」リストを管理することもできます。

class ItemTpComparer : IComparer<itemTp> 
{ 
    private IList<codeTp> otherList; 

    public ItemTpComparer(IList<codeTp> otherList) 
    { 
     this.otherList = otherList; 
    } 

    public int Compare(itemTp a, itemTp b) 
    { 
     return otherList.IndexOf(a.Code) - otherList.IndexOf(b.Code); 
    } 
} 

、ソートを実行するには:

オブジェクトにC#3とLINQを使用して
myList.Sort(new ItemTpComparer(otherList)); 
+0

私は利点があるとは言いません。デリゲートをインターフェイスに渡すのと同じ方法でインスタンスメソッドに渡すことができ、そこに必要なロジックを持たせることができます。 – Groo

+0

これは素晴らしく、ちょうど1つの質問で、あなたはotherListのIndexOfにaとbを渡しています...もし "TestMeNow"と "TestMeLater"があったらどうなりますか?Indexofはそれぞれ1つずつ6を返します。 –

+0

私はあなたのコメントを理解していません。 TestMeNowとTestMeLaterが他のリストにある場合、それらは両方ともインデックス6にありません。 – anthony

0

申し訳ありませんが、私はここにインストールされ、C#のエディタがありませんが、それはこのようなものです:

Array.Sort(
    itemTps, 
    delegate(ItemTp a, ItemTp b) 
    { 
      return secondList.IndexOf(a.Code) - secondList.IndexOf(b.Code); 
    }); 

注:それが最も効率的な方法ではないかもしれない、ともまったくあり2番目のリストにコードがまったく含まれていないかどうかを確認します。

[編集] MehrdadがArray.Sortは、一般的なIList<T>のために動作しない、言ったように。配列内の配列をソートするには、ArrayList.Adapterメソッドを使用してラッパーを作成し、ソートする必要があります。 ArrayList.Sortはデリゲートの比較をサポートしていないため、匿名のデリゲートをIComparer<T>の実装内に配置する必要があります。

別のリストでソートする必要がある場合は、最初に配列を作成して上記のロジックを使用すると意味があります。

+0

アレイ。SortはジェネリックIListでは機能しません

+0

ええと私はコンターについてしか考えていませんでした。ここにあります:http://stackoverflow.com/questions/15486/sorting-an-ilist-in-c – Groo

0

、私はだけではなく、既存のものを並べ替えるしようとしているの新しいリストを作成します。

void Example() 
{ 
    IList<string> codes; 
    IList<ItemTp> itemTps; 
    itemTps = codes.Select(code => itemTps.Single(itp => itp.Code == code)).ToList(); 
} 
関連する問題