是否存在代码,用于在C#中将List元素向左或向右移动指定的数量?

是否存在代码,用于在C#中将List元素向左或向右移动指定的数量?

这是一个棘手的代码,编写和测试特殊情况需要一些时间,如果它存在,我宁愿重用一些东西。

谢谢

这样的东西换了……

 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受到保护免受Array.Copy : 如果sourceArray和destinationArray重叠,则此方法的行为就像sourceArray的原始值在覆盖destinationArray之前保留在临时位置一样。

下面是一些扩展方法,可以向右或向左移动列表。 方法将返回一个列表。

 public static class ShiftList { public static List ShiftLeft(this List list, int shiftBy) { if (list.Count <= shiftBy) { return list; } var result = list.GetRange(shiftBy, list.Count-shiftBy); result.AddRange(list.GetRange(0,shiftBy)); return result; } public static List ShiftRight(this List list, int shiftBy) { if (list.Count <= shiftBy) { return list; } var result = list.GetRange(list.Count - shiftBy, shiftBy); result.AddRange(list.GetRange(0, list.Count - shiftBy)); return result; } } 

这是一个如何调用它的例子。

 class Program { static void Main(string[] args) { List test = Enumerable.Range(0, 10).ToList(); test = test.ShiftLeft(1); PrintList(test); Console.WriteLine(""); PrintList(test.ShiftRight(2)); Console.ReadLine(); } private static void PrintList(List test) { for (int i = 0; i < test.Count; i++) { Console.WriteLine(test[i]); } } }