加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 07:57:29 所属栏目:百科 来源:网络整理
导读:我发现这比我想象的要难得多.如何在列表中移动一部分项目? 例如,如果我有以下列表: Listint myList = new Listint();for(int i=0; i10; i++) { myList.Add(i);} 该列表将包含{0,1,2,3,4,5,6,7,8,9}. 如何移动List的各个部分?假设我想将{7,9}移动到第4个索
我发现这比我想象的要难得多.如何在列表中移动一部分项目?

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

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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读