【发布时间】:2019-04-09 20:25:32
【问题描述】:
首先我必须说,在我在这里发布这个问题之前,我整天都在寻找我的答案。我得到的最接近的答案是here,但有些答案对我不起作用,而另一些答案对我来说太复杂了,我无法理解。 让我清楚地解释我想要实现的目标:为简单起见,让我们认为我有一个由“6”个对象组成的列表。我在列表中随机选择一个索引,比如说 myList[index=2]。然后我希望这个对象位于列表的末尾,这意味着它的索引值现在是 5。我还想重新排列未触及的对象以获得相同大小的列表而没有空索引值。完成所有这些步骤后,它应该是这样的:
目前我的代码是这样的:
public static void Move<T>(this List<T> list, int oldIndex, int newIndex)
{
if ((oldIndex == newIndex) || (0 > oldIndex) || (oldIndex >= list.Count) || (0 > newIndex) ||
(newIndex >= list.Count)) return;
// local variables
var i = 0;
T tmp = list[oldIndex];
for (i = oldIndex+1; i < newIndex; i++)
{
list[i] = list[i - 1];
}
list[newIndex] = tmp;
}
但是,正如您可以预测的那样,它不起作用。此列表中的游戏对象的 Debug.DrawLine 向我显示,当我使用我的代码将项目移动到列表中时,我会留下两个对象,一个是 myList[0],另一个是我添加的 myList[5]。之后其他行消失。
【问题讨论】:
-
Sounds
LinkedList<T>可以帮助你...例如,你有 1 2 3 4 5 然后拿 3,那么下一个订单应该是 1 2 4 5 3? -
我认为您需要
+ 1而不是- 1,以及oldIndex而不是oldIndex+1,以及i < newIndex - 1而不是i < newIndex。但这仅在 newIndex > oldIndex 时有效。如果它与您拥有的代码相反的话会更准确。 -
只是为了进一步澄清,您正在寻找一种方法来提取给定索引处的对象,然后将其添加到列表的末尾?还是在给定索引处提取对象,然后将其添加到另一个指定索引处?
-
@SharpNip 是前者。当我调用这个方法时,我总是给 newIndex (list.Count-1) 所以它在我列表的末尾。
-
好吧,您已经将“oldIndex”中的副本保存到变量“tmp”中,所以我认为您只想在“list.RemoveAt(oldIndex)”之后添加“list.Add(tmp)”在最后添加它。也许我错过了什么......
标签: c# arrays list sorting unity3d