微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.jb51.cc/csharp/100094.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐