【问题标题】:How do i move a list object at the end of the list while shifting back the others? [duplicate]如何移动列表末尾的列表对象,同时移回其他对象? [复制]
【发布时间】: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&lt;T&gt; 可以帮助你...例如,你有 1 2 3 4 5 然后拿 3,那么下一个订单应该是 1 2 4 5 3?
  • 我认为您需要+ 1 而不是- 1,以及oldIndex 而不是oldIndex+1,以及i &lt; newIndex - 1 而不是i &lt; newIndex。但这仅在 newIndex > oldIndex 时有效。如果它与您拥有的代码相反的话会更准确。
  • 只是为了进一步澄清,您正在寻找一种方法来提取给定索引处的对象,然后将其添加到列表的末尾?还是在给定索引处提取对象,然后将其添加到另一个指定索引处?
  • @SharpNip 是前者。当我调用这个方法时,我总是给 newIndex (list.Count-1) 所以它在我列表的末尾。
  • 好吧,您已经将“oldIndex”中的副本保存到变量“tmp”中,所以我认为您只想在“list.RemoveAt(oldIndex)”之后添加“list.Add(tmp)”在最后添加它。也许我错过了什么......

标签: c# arrays list sorting unity3d


【解决方案1】:

你想多了。

var value = list[index];
list.RemoveAt(index);
list.Add(value);

【讨论】:

  • 我会在之前添加一个if (oldIndex &gt;= list.Count) return;
  • @SharpNip 列表中的索引永远不会是&gt;= list.Count .. 我猜你提到了if(index == list.Count - 1) return;。对于给出不正确索引的其他情况,我总是宁愿抛出错误/异常以便正确调试为什么甚至提供了错误的索引,而不是通过简单地返回来隐藏这个事实;)
  • 我很抱歉重复的帖子。我之前尝试过这个解决方案,但我无法让它工作。一定漏掉了什么。谢谢大家的回答。
  • @derHugo,传递的索引不是来自“列表内”,它作为参数传递给方法,这就是为什么如果传递的索引更大,则不希望执行任何操作比列表中的项目数。此外,如果传递给方法的索引是 List 中的最后一个对象或更大的对象,if(index == list.Count - 1) 将抛出异常,并且考虑到原始代码,这不是我们想要的。
  • @SharpNip 我认为你没有完全理解我的意思。 1. 您可以返回if(index == list.Count - 1),因为它已经列表中的最后一项,因此无事可做。 2. 这里提供的答案甚至不需要oldindex 参数,因为它只需要移动到末尾的元素的一个当前index。 3. 正如我解释的那样,我不会简单地在输入无效的情况下返回,而是希望抛出异常/错误以便正确找出我做错了什么,而不是通过简单地返回而没有任何反馈来混淆它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-15
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 2021-09-14
  • 2018-11-18
相关资源
最近更新 更多