我发现这比我想象的要难得多.如何在列表中移动一部分项目?
例如,如果我有以下列表:
List<int> myList = new List<int>(); for(int i=0; i<10; i++) { myList.Add(i); }
该列表将包含{0,1,2,3,4,5,6,7,8,9}.
如何移动List的各个部分?假设我想将{7,9}移动到第4个索引,使其成为:
{ 0,9,6 }
或者,假设我想将{0,9}中的{1,2}移动到第8个索引,9 }
谁能提供一些代码?像下面那样需要3个值的东西会很棒.
MoveSection(insertionPoint,startIndex,endIndex)
请注意,从开头删除部分时,插入位置已更改.这使得它变得更加困难.
解决方法
你可以相对简单地使用迭代器块对任何IEnumerable执行此操作.我总是发现使用yield return构造以清晰简洁的方式解决了这类问题.在这里,我还将该方法转换为易于使用的扩展方法:
public static class Extension { public static IEnumerable<T> MoveSection<T>(this IEnumerable<T> @this,int insertionPoint,int startIndex,int endIndex) { var counter = 0; var numElements = endIndex - startIndex; var range = Enumerable.Range(startIndex,numElements); foreach(var i in @this) { if (counter == insertionPoint) { foreach(var j in @this.Skip(startIndex).Take(numElements)) { yield return j; } } if (!range.Contains(counter)) { yield return i; } counter++; } //The insertion point might have been after the entire list: if (counter++ == insertionPoint) { foreach(var j in @this.Skip(startIndex).Take(numElements)) { yield return j; } } } }
在这里,我使用Linq方法Skip和Take,这些方法通常很有用.此外,您可能对Enumerable.Range方法感兴趣,该方法允许像使用for循环一样轻松创建范围.
myList.MoveSection(8,3);