首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C#中移动数组的开头?

如何在C#中移动数组的开头?
EN

Stack Overflow用户
提问于 2009-09-24 11:04:47
回答 7查看 5.9K关注 0票数 5

我正在尝试根据值的第一次出现来重组数组(从而模拟类似于循环数组的功能)。

例如,在下面的数组中,我希望值6的第一次出现成为新的第一个元素,之前的元素成为后者:

所以:

代码语言:javascript
复制
int[] myArray = {2, 3, 6, 1, 7, 6};

变成:

代码语言:javascript
复制
myArray = {6, 1, 7, 6, 2, 3};

实现这一目标的“最佳”方法是什么?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-09-24 11:20:00

代码语言:javascript
复制
int[] myArray = { 2, 3, 6, 1, 7, 6 };
myArray = myArray
            .SkipWhile(i => i != 6)
            .Concat(myArray.TakeWhile(i => i != 6))
            .ToArray();

应该能起到作用!

你将需要一个使用System.Linq

票数 21
EN

Stack Overflow用户

发布于 2009-09-24 11:16:33

Thorsten的解决方案创建了一个新的数组;这里有一个就地版本,它只创建一个与旋转大小一样大的临时数组:

代码语言:javascript
复制
public static void RotateLeft<T>(T[] array, int places)
{
    T[] temp = new T[places];
    Array.Copy(array, 0, temp, 0, places);
    Array.Copy(array, places, array, 0, array.Length - places);
    Array.Copy(temp, 0, array, array.Length - places, places);
}

我确信只需一个临时缓冲区项就可以完成,但这将更加复杂:)

为了提高效率,这里有一个“向左旋转一处”的快捷方式:

代码语言:javascript
复制
public static void RotateLeft<T>(T[] array)
{
    T temp = array[0];
    Array.Copy(array, 0, array, 1, array.Length - 1);
    array[array.Length-1] = temp;
}
票数 9
EN

Stack Overflow用户

发布于 2009-09-24 11:08:47

您可以执行以下操作:

  1. 创建与original
  2. Determine大小相同的新数组
  3. 使用Array.Copy()将从源数组的起始索引到结尾的所有内容复制到目标数组
  4. 使用Array.Copy()复制从0到源数组的起始索引到目标数组结尾的所有内容

这样,您就可以获得源数组的一个副本,该副本看起来与您期望的一样。

但是,您必须使用Array.Copy()的各种重载,因为我现在还不知道确切的参数值。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1470982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档