Что-то вроде этого для сдвига влево ...
public static void ShiftLeft(List lst, int shifts)
{
for (int i = shifts; i < lst.Count; i++)
{
lst[i - shifts] = lst[i];
}
for (int i = lst.Count - shifts; i < lst.Count; i++)
{
lst[i] = default(T);
}
}
Для переключения вправо это немного сложнее, потому что мы должны копировать в обратном направлении
public static void ShiftRight(List lst, int shifts)
{
for (int i = lst.Count - shifts - 1; i >= 0; i--)
{
lst[i + shifts] = lst[i];
}
for (int i = 0; i < shifts; i++)
{
lst[i] = default(T);
}
}
. С массивами это гораздо проще, потому что Array
имеет очень мощные методы:
public static void ShiftLeft(T[] arr, int shifts)
{
Array.Copy(arr, shifts, arr, 0, arr.Length - shifts);
Array.Clear(arr, arr.Length - shifts, shifts);
}
public static void ShiftRight(T[] arr, int shifts)
{
Array.Copy(arr, 0, arr, shifts, arr.Length - shifts);
Array.Clear(arr, 0, shifts);
}
И да, Array.Copy
защищен от overleap: Если sourceArray и destinationArray перекрываются , этот метод ведет себя так, как если бы исходные значения sourceArray сохранялись во временном месте до того, как файл назначения был перезаписан.