2017-03-07 118 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(); 

现在,所有的说:这听起来像你在这里做太多的工作,因为你选择了错误的数据结构体。这听起来像你的问题需要一个优先级队列的最小堆实现,而不是一对列表。有没有理由不使用优先队列?