将第一个数组元素移动到C#结束

Jar*_*rth 2 c# arrays

这是一个基本问题(我是C#的新手),但是有一种有效的方法可以将第一个元素移动到C#中的数组末尾吗?

我发现了这个问题,它描述了.rotateruby 中的方法,但是我无法在C#中找到类似的方法.

如果我有一个数组:

[1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

C#中是否有一个函数返回:

[2, 3, 4, 5, 1]
Run Code Online (Sandbox Code Playgroud)

提前致谢!

编辑:答案

最好的解决方案是LinkedList<T>尽可能多地使用你建议的,如Alex的回答所示.他建议的解决方案是使用:

list.AddLast(list.RemoveFirst());
Run Code Online (Sandbox Code Playgroud)

可以在for循环中运行:

    void func<T>(LinkedList<T> list, int rotate) {
    for(var i = 0; i < rotate; i++) {
       list.AddLast(list.RemoveFirst());
    }
}
Run Code Online (Sandbox Code Playgroud)

感谢大家的帮助!

Mag*_*nus 7

有很多方法可以实现这一目标.一种方法是:

var result = arr.Skip(1).Concat(arr.Take(1))
Run Code Online (Sandbox Code Playgroud)

  • 根据结果​​的使用方式,IEnumerable 可能就足够了。但如果需要数组,只需在最后加上 `.ToArray()` 即可。 (2认同)

Ale*_*lex 6

如果你使用LinkedList<T>而不是array<T>你可以使用这个:

list.AddLast(list.RemoveFirst());
Run Code Online (Sandbox Code Playgroud)

复杂性O(1).当您多次执行此操作时:

void func<T>(LinkedList<T> list, int rotate) {
    for(var i = 0; i < rotate; i++) {
       list.AddLast(list.RemoveFirst());
    }
}
Run Code Online (Sandbox Code Playgroud)

你会有一个复杂的O(N)[ N旋转次数].这是性能方面的最佳解决方案.

如果你真的需要使用数组,这可能是一个天真的解决方案:

var tmp = list[0];
for(var i = 1; i < list.Length; i++) {
   list[i - 1] = list[i];
}
list[list.Length - 1] = tmp;
Run Code Online (Sandbox Code Playgroud)

(请注意,没有范围检查)

但如果您经常需要这样做,这将非常耗时.如果您多次执行此操作:

void func<T>(T[] list, int rotate) {
    for(var j = 0; j < rotate; j++) {
       var tmp = list[0];
       for(var i = 1; i < list.Length; i++) {
           list[i - 1] = list[i];
       }
       list[list.Length - 1] = tmp;
    }
}
Run Code Online (Sandbox Code Playgroud)

最终会得到O(N^2) = O(N * M)[ N元素M数量和旋转次数].这真的很糟糕.一个更好的方法,如果你提前知道你经常会这样做:

void func<T>(T[] list, int rotate {
    for(var j = 0; j < list.Length; j++) {
        var tmp = list[j];
        var ix = (rotate + j) % list.Length;
        list[j] = list[ix];
        list[ix] = tmp;
    }
}
Run Code Online (Sandbox Code Playgroud)

这将导致O(N)[ N元素数量在哪里].

正如其他人已经建议的那样,如果您需要在多个位置使用此扩展方法,那么最好编写扩展方法.