Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c语言中的排序列表#_C#_List_Sorting - Fatal编程技术网

C# c语言中的排序列表#

C# c语言中的排序列表#,c#,list,sorting,C#,List,Sorting,我有两个C#格式的列表 我想按升序对numberList中的数字进行排序,并希望objectList中的ObjectTcs与它们一起移动: 排序后: objectList: |o4 | o1 | o5 | o2 | o3 | ... numberList: 1 3 4 5 6 ... 在实际应用中,我需要它来实现N皇后问题上的爬山算法。在objectList中,我存储板上所有皇后的位置,在numberList中,我存储

我有两个C#格式的列表

我想按升序对numberList中的数字进行排序,并希望objectList中的ObjectTcs与它们一起移动: 排序后:

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

在实际应用中,我需要它来实现N皇后问题上的爬山算法。在objectList中,我存储板上所有皇后的位置,在numberList中,我存储位置的计算启发式。然后我想对数字列表进行排序,这样我就可以得到启发式值最低的位置。目标是移动到启发式值最低的位置。

将对象列表转换为一系列与索引成对的项目:

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();

现在,所有这些都表明:听起来您在这里做了太多的工作,因为您选择了错误的数据结构。在我看来,您的问题需要优先级队列的最小堆实现,而不是一对列表。您不使用优先级队列有什么原因吗?

将对象列表转换为一系列与索引成对的项目:

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();

现在,所有这些都表明:听起来您在这里做了太多的工作,因为您选择了错误的数据结构。在我看来,您的问题需要优先级队列的最小堆实现,而不是一对列表。您不使用优先级队列有什么原因吗?

最好使用包装对象将它们组合到同一个列表中:/n如果您的值是连接的,为什么要将它们保留在单独的列表中?无论如何,你的问题是什么?什么不起作用?有一种方法可以帮你。因此,您可以从列表中创建临时数组,进行排序,然后将数组内容复制回来。据我所知,在
列表
API或LINQ中没有相应的功能。为什么这个问题被解决了?他要求做的事情非常清楚,这并不是一个罕见的操作。@Jim Mischel,你能帮忙吗?最好使用包装对象将它们合并到同一个列表中:/n如果你的值是连接的,为什么要将它们保存在单独的列表中?无论如何,你的问题是什么?什么不起作用?有一种方法可以帮你。因此,您可以从列表中创建临时数组,进行排序,然后将数组内容复制回来。据我所知,在
列表
API或LINQ中没有相应的功能。为什么这个问题被解决了?他要做的事情很清楚,这也不是什么稀奇的手术。@Jim Mischel,你能帮忙吗?