You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何高效将数组首个元素移至末尾?

嗨,作为C#新手碰到这个问题太正常啦!Ruby里的rotate确实好用,C#虽然没有直接对应的内置方法,但我们有好几种方式实现,还能根据场景选最优解:

1. 原地修改数组(适合小型数组/不需要保留原数组)

如果想直接修改原数组,用Array.Copy是比较高效的方式,比手动循环移动元素要快:

int[] arr = { 1, 2, 3, 4, 5 };
// 先处理边界情况:空数组或单元素数组无需操作
if (arr.Length <= 1) return;

int firstElement = arr[0];
// 把索引1到末尾的元素往前复制一位
Array.Copy(arr, 1, arr, 0, arr.Length - 1);
// 把第一个元素放到最后一位(C# 8.0+支持^1语法,等价于arr[arr.Length-1])
arr[^1] = firstElement;
// 此时arr的值就是[2,3,4,5,1]

2. LINQ简洁实现(适合快速写代码/需要新数组)

要是追求代码简洁,不想手动操作数组,LINQ的Skip和Take可以一行搞定:

int[] arr = { 1, 2, 3, 4, 5 };
if (arr.Length <= 1) return arr;

int[] rotatedArr = arr.Skip(1).Concat(arr.Take(1)).ToArray();

⚠️ 注意:这种方式会创建新数组,原数组不会被修改,适合不需要保留原数组的场景。

3. 最佳方案:LinkedList(频繁旋转场景首选)

正如你补充提到的,如果需要频繁执行这种首尾移动操作,LinkedList<T>是最优选择!因为它的首尾节点操作是O(1)的时间复杂度,不需要像数组那样移动大量元素:

var linkedList = new LinkedList<int>(new[] { 1, 2, 3, 4, 5 });
if (linkedList.Count == 0) return;

var firstNode = linkedList.First;
linkedList.RemoveFirst();
linkedList.AddLast(firstNode);

// 如果需要转回数组,可以用:
// int[] rotatedArr = linkedList.ToArray();

这种方式在频繁旋转的场景下,性能比数组操作好太多,完全避免了数组元素移动的开销。

另外别忘了处理空数组、单元素数组这类边界情况,避免出现索引越界的错误哦~

内容的提问来源于stack exchange,提问作者Jared Forth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:45:20