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

本文关键字:移动 右移 代码 用于 存在 是否 List 元素 | 更新日期: 2023-09-27 18:27:28

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

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

感谢

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

左移时会出现类似的情况。。。

public static void ShiftLeft<T>(List<T> 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<T>(List<T> 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>(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>(T[] arr, int shifts)
{
    Array.Copy(arr, 0, arr, shifts, arr.Length - shifts);
    Array.Clear(arr, 0, shifts);
}

是的,Array.Copy受到防重叠保护:如果sourceArray和destinationArray重叠,则此方法的行为就像在覆盖destinationArray之前,sourceArray的原始值被保留在临时位置一样。

下面是两个扩展方法,它们将向右或向左移动列表。这些方法将返回一个列表。

public static class ShiftList
{
    public static List<T> ShiftLeft<T>(this List<T> 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<T> ShiftRight<T>(this List<T> 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<int> 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<int> test)
    {
        for (int i = 0; i < test.Count; i++)
        {
            Console.WriteLine(test[i]);
        }
    }
}

通过将第一部分和第二部分翻转来保持简单。ShiftRight 也是如此

    public static List<int> ShiftLeft(List<int> a, int d)
    {
        if (a.Count > d)
        {
            var beginingPart = a.GetRange(0, d);
            var remainingPart = a.GetRange(d, a.Count - d);
            return remainingPart.Concat(beginingPart).ToList();
        }
        else if (a.Count < d)
        {
            var mod = d % a.Count;
            if (mod != 0)
            {
                return rotLeft(a, mod);
            }
        }
        return a;
    }

给定"迭代";是你想要改变的时间;数字";是列表

左移:

static void ShiftLeft(int iterations)
    {
        for (int i = 0; i < iterations; i++)
        {
            numbers.Add(numbers[0]);
            numbers.RemoveAt(0);
        }
    }

右移:

static void ShiftRight(int iterations)
    {
        for (int i = 0; i < iterations; i++)
        {
            numbers.Insert(0, numbers[numbers.Count - 1]);
            numbers.RemoveAt(numbers.Count - 1);
        }
    }