2017-03-07 1 views
1

C#には2つのリストがあります。Cでリストをソートする

public List<MyClass> objectList = new List<MyClass>(); // it is filled with MyClass objects 

public List<int> numberList = new List<int>(); // it is filled with numbers 

numberListの数字のインデックスはobjectListに索引をオブジェクトに対応し:例えば:objectList [0] = O1とnumberList [0] = 3。 objectList [1] = O2とnumberListは、[1]私は昇順でnumberListで数字をソートしたいとobjectListでobjetcsは彼らと一緒に移動するために私がしたい5 ...

objectList:    |o1 | o2 | o3 | o4 | o5 | ... 
numberList:    3  5 6 1 4 ... 

を=: ソート後:

objectList:    |o4 | o1 | o5 | o2 | o3 | ... 
numberList:    1  3 4 5 6 ... 

実際には、Nクイーンの問題でヒルクライミングアルゴリズムを実装するために必要です。 objectListにはボード上のすべてのクイーンズの位置が格納され、numberListにはその位置の計算されたヒューリスティックが格納されます。次に、numberListをソートして、最低のヒューリスティックな値でポジションを取得します。目標は、ヒューリスティックな値が最も低い位置に移動することです。

+4

ラッピングオブジェクトを使用して同じリストに結合する方が良い:/ – Will

+2

値が接続されている場合は、別々のリストに保管しているのはなぜですか?いずれにせよ、あなたの質問は何ですか?何が効いていないのですか? – David

+0

これを行う[Array.Sort overload](https://msdn.microsoft.com/en-us/library/85y6y2d3(v = vs.110).aspx)があります。したがって、リストから一時的な配列を作成し、並べ替えを行い、配列の内容をコピーすることができます。私の知る限り、 'List ' APIまたはLINQに対応する機能はありません。 –

答えて

7

は、それぞれのインデックスとペアの項目の順序にあなたのオブジェクトのリストを変換する:今すぐ注文したリストを持っている

var orderedPairs = pairs.OrderBy(pair => numberList[pair.index]); 

var pairs = objectList.Select(item, index) => new { item, index }; 

は、今あなたが発注を行うために使用できる何かを持っていますペアのその裏の項目の順序付きリストに回す:

var ordered = orderedPairs.Select(pair => pair.item); 

と、リストにそれを回す:あなたのオリジナルのリストが変更されていないことを

var orderedList = ordered.ToList(); 

注意。これにより、新しいリストが作成されます。

使用すると、1つの式でそれをすべて行うことができますもちろん、あなたが好きなら:あなたは間違ったデータを選択したので、あなたはここであまりにも多くの仕事をやっているように聞こえる:今すぐ

objectList = objectList 
    .Select((item, index) => new { item, index }) 
    .OrderBy(pair => numberList[pair.index]) 
    .Select(pair => pair.item) 
    .ToList(); 

、言ったことすべて構造。あなたの問題が優先順位キューのminヒープ実装を必要とするのではなく、一対のリストを必要とするようなことは私には聞こえます。優先キューを使用していない理由がいくつかありますか?

関連する問題