2017-03-07 168 views
1

我在C#中有兩個列表。在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號碼的索引對應於對象在鏈表類索引:例如:鏈表類[0] = 01和numberList [0] = 3; 鏈表類[1] = O2和numberList [1] = 5 ......

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

我想在升序numberList分類編號,我想在鏈表類的objetcs與他們移動: 排序後:

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

在實際應用中,我需要這個在N皇后問題上實現爬山算法。在objectList中,我存儲棋盤上所有皇后的位置,並在numberList中存儲位置的計算啓發式。然後,我想對numberList進行排序,以便獲得啓發式值最低的位置。目標是轉移到啓發式值最低的位置。

+4

更好地使用包裝對象將它們組合到同一個列表中:/ – Will

+2

如果您的值已連接,爲什麼要將它們保存在單獨的列表中?無論如何,你的問題是什麼?什麼不起作用? – David

+0

有一個[Array.Sort重載](https://msdn.microsoft.com/en-us/library/85y6y2d3(v = vs.110).aspx)將爲您執行此操作。所以你可以從列表中創建臨時數組,然後進行排序,然後將數組內容複製回來。據我所知,'List ' API或LINQ中沒有相應的功能。 –

回答

7

將您的對象列表與他們的指數配對的一系列項目爲:

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

現在,你有什麼事情,你可以用做一個排序:

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

現在你有一個有序列表對。把這一回項目的有序列表:

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

,並把它變成一個列表:

var orderedList = ordered.ToList(); 

請注意,您的原始列表不會改變。這會創建一個新的列表,該列表按您的需要排列。

當然,你可以做到這一切在一個表達式,如果你喜歡:

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

現在,所有的說:這聽起來像你在這裏做太多的工作,因爲你選擇了錯誤的數據結構體。這聽起來像你的問題需要一個優先級隊列的最小堆實現,而不是一對列表。有沒有理由不使用優先隊列?