C#移动列表中的一部分项目

前端之家收集整理的这篇文章主要介绍了C#移动列表中的一部分项目前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我发现这比我想象的要难得多.如何在列表中移动一部分项目?

例如,如果我有以下列表:

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方法SkipTake,这些方法通常很有用.此外,您可能对Enumerable.Range方法感兴趣,该方法允许像使用for循环一样轻松创建范围.

然后,您可以像这样调用方法

myList.MoveSection(8,3);
原文链接:https://www.f2er.com/csharp/100094.html

猜你在找的C#相关文章