在c#中排序列表

mrN*_*ody 1 c# sorting list

我在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进行排序,以便获得具有最低启发值的位置.目标是移动到具有最低启发值的位置.

Eri*_*ert 7

将您的对象列表转换为与其索引配对的项目序列:

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)

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