2016-10-22 5 views
1

ずつリストをソートするときに、次のように私は(これは単純化した例である)二つのリストを持って働いていない比較子をデフォルト:C#の - 予想通り、別の

void SortOneListByAnother<T1, T2>(List<T1> dataList, List<T2> sortList) 
    where T1 : IComparable 
    where T2 : IComparable 
{ 
    dataList.Sort((a, b) => sortList[dataList.IndexOf(a)].CompareTo(sortList[dataList.IndexOf(b)])); 
} 

var dataList = new List<char>{ 'a', 'b', 'c', 'd', 'e', 'f' }; 
var sortList = new List<int>{ 6, 5, 4, 3, 2, 1 }; 

は、ここに私のソート方法は次のようになります。

この sortlistがありソートされているのと同じ方法でソートされたデータリスト(文字のリスト)(この場合には、逆の順序)を、返す必要がありますすなわち:

{ 'f', 'e', 'd', 'c', 'b', 'a' } 

代わりに、私のコードはリストの最初と最後の要素を無視しているように見えます。だから私は得ている:

{ 'a', 'e', 'd', 'c', 'b', 'f' } 

私はおそらく何が間違っていることができますか?

+0

配列とリストには、0から始まるインデックスが付けられています。代わりに、sortList = new List {5、4,3,2,1,0} – YSharp

+0

リストの最初の要素はインデックス0でインデックス1ではないことを覚えておいてください。 –

+0

サイドノートでは、ソート方法かなり非効率的です。 – CSharpie

答えて

1

List.Sortは並べ替えを実行するので、比較するとdataList.IndexOf(a)が呼び出されると、要素は既に部分的にソートされているため、未定義の動作が発生します。

元のdataListのコピーを作成し、ソート中にインデックスを参照する必要があります。

サンプルコード:サイドノートで

void SortOneListByAnother<T1, T2>(List<T1> dataList, List<T2> sortList) 
    where T1 : IComparable 
    where T2 : IComparable 
{ 
    var lookupList = new List<T1>(dataList); 
    dataList.Sort((a, b) => sortList[lookupList.IndexOf(a)].CompareTo(sortList[lookupList.IndexOf(b)])); 
} 

、このソートアルゴリズムは、おそらくO(N^3)最悪の場合の時間複雑性を有します。

+0

そして 'OrderBy'を使うことはソートキーを一度具体化するので修正されます。 – usr

+0

ありがとうございます。これは機能します。あなたの提案を受け取り、SortではなくOrderByを使用したいと思います。しかし、OrderByのシグネチャは異なります。私はComparerを渡す方法を理解できません。私はこれを行う場合: –

+0

私はこれを行う場合: dataList = dataList.OrderBy(x =(x、(a、b)=> sortList [dataList.IndexOf(a)]。)CompareTo(sortList [dataList.IndexOf(b) ]))); –

関連する問題