我在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
Run Code Online (Sandbox Code Playgroud)
numberList中的数字索引对应于objectList中的对象索引:例如:objectList [0] = o1和numberList [0] = 3; objectList [1] = o2和numberList [1] = 5 ...
objectList: |o1 | o2 | o3 | o4 | o5 | ...
numberList: 3 5 6 1 4 ...
Run Code Online (Sandbox Code Playgroud)
我想按照升序对numberList中的数字进行排序,我希望objectList中的objetcs随之移动:排序后:
objectList: |o4 | o1 | o5 | o2 | o3 | ...
numberList: 1 3 4 5 6 ...
Run Code Online (Sandbox Code Playgroud)
在实际使用中,我需要这个用于在N皇后问题上实现Hill爬山算法.在objectList中,我存储了板上所有皇后的位置,并且在numberList中存储了计算的位置的启发式.然后我想对numberList进行排序,以便获得具有最低启发值的位置.目标是移动到具有最低启发值的位置.
将您的对象列表转换为与其索引配对的项目序列:
var pairs = objectList.Select(item, index) => new { item, index };
Run Code Online (Sandbox Code Playgroud)
现在您可以使用一些东西来进行排序:
var orderedPairs = pairs.OrderBy(pair => numberList[pair.index]);
Run Code Online (Sandbox Code Playgroud)
现在你有一个有序的对列表.将其转回有序的项目列表:
var ordered = orderedPairs.Select(pair => pair.item);
Run Code Online (Sandbox Code Playgroud)
并将其变成一个列表:
var orderedList = ordered.ToList();
Run Code Online (Sandbox Code Playgroud)
请注意,您的原始列表不会更改.这将按您想要的顺序创建一个新列表.
当然,如果您愿意,可以在一个表达式中完成所有操作:
objectList = objectList
.Select((item, index) => new { item, index } )
.OrderBy(pair => numberList[pair.index])
.Select(pair => pair.item)
.ToList();
Run Code Online (Sandbox Code Playgroud)
现在,所有这一切:听起来你在这里做了太多工作,因为你选择了错误的数据结构.听起来像你的问题需要一个优先级队列的最小堆实现,而不是一对列表.您有没有使用优先级队列的原因?