11

リスト要素を指定された量だけ左または右にシフトするためのコードがC#に存在しますか?

これはトリッキーなコードです。特殊なケースを作成してテストするには時間がかかります。存在する場合は、何かを再利用したいと考えています。

ありがとう

4

3 に答える 3

13

左シフトのこのようなもの...

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 がオーバーラップする場合、このメソッドは、sourceArray の元の値が、destinationArray が上書きされる前に一時的な場所に保持されているかのように動作します。

于 2013-08-12T06:49:34.230 に答える