这是一个经典问题,答案很简单:如果要将第 3 项移动到位置 2,则必须先将 2 的排序列更改为临时数字(例如 99)。所以它是这样的:
Move 2 to 99
Move 3 to 2
Move 99 to 3
但是,您必须小心,您的临时值永远不会在正常处理中使用,并且如果适用,您尊重多个线程。
更新:顺便说一句 - 处理“多个用户可能正在更改订单”问题的一种方法是做我所做的:给每个用户一个数字 ID,然后将其添加到临时号码(我的员工 ID 实际上是唯一身份用于门控登录的人员表中的字段 ID)。因此,例如,如果您的头寸永远不会为负,您可以使用 -1000 - UserID 作为您的临时值。不过相信我一件事:你不想只是假设你永远不会发生碰撞。如果您认为并且确实发生了这种情况,那么调试将非常困难!
更新:GUZ 指出他的用户可能已经重新订购了整套订单项并将它们作为一批提交——这不仅仅是两条记录的切换。那么,您可以通过以下两种方式之一来解决此问题。
首先,您可以将整个集合的现有排序字段更改为一组新的非冲突值(例如 -100 - (staffID * maxSetSize) + existingOrderVal),然后逐条记录并将每条记录更改为新的订单价值。
或者,您基本上可以将其视为数组上的冒泡排序,其中 orderVal 值等同于您的数组索引。要么这对您来说非常有意义(并且很明显),要么您应该坚持解决方案 1(无论如何这更容易)。