我正在尝试根据值的第一次出现来重组数组(从而模拟类似于循环数组的功能)。
例如,在下面的数组中,我希望值6的第一次出现成为新的第一个元素,之前的元素成为后者:
所以:
int[] myArray = {2, 3, 6, 1, 7, 6};变成:
myArray = {6, 1, 7, 6, 2, 3};实现这一目标的“最佳”方法是什么?
发布于 2009-09-24 11:20:00
int[] myArray = { 2, 3, 6, 1, 7, 6 };
myArray = myArray
.SkipWhile(i => i != 6)
.Concat(myArray.TakeWhile(i => i != 6))
.ToArray();应该能起到作用!
你将需要一个使用System.Linq;
发布于 2009-09-24 11:16:33
Thorsten的解决方案创建了一个新的数组;这里有一个就地版本,它只创建一个与旋转大小一样大的临时数组:
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);
}我确信只需一个临时缓冲区项就可以完成,但这将更加复杂:)
为了提高效率,这里有一个“向左旋转一处”的快捷方式:
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;
}发布于 2009-09-24 11:08:47
您可以执行以下操作:
Array.Copy()将从源数组的起始索引到结尾的所有内容复制到目标数组Array.Copy()复制从0到源数组的起始索引到目标数组结尾的所有内容这样,您就可以获得源数组的一个副本,该副本看起来与您期望的一样。
但是,您必须使用Array.Copy()的各种重载,因为我现在还不知道确切的参数值。
https://stackoverflow.com/questions/1470982
复制相似问题