Логика метода Array.Reverse()

какова собственная логика работы public static void Reverse (массив массива, индекс int, длина int);


person prantick    schedule 19.05.2010    source источник
comment
С двумя правильными ответами на эту тему все, что мне осталось, это предложить вам .NET Reflector ... с помощью этого инструмента вы можете самостоятельно разобрать этот метод. (Или вы можете скачать исходники .NET)   -  person Hinek    schedule 19.05.2010


Ответы (3)


Для этого вы можете использовать .NET Reflector:

[ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
public static void Reverse(Array array, int index, int length)
{
    if (array == null)
    {
        throw new ArgumentNullException("array");
    }
    if ((index < array.GetLowerBound(0)) || (length < 0))
    {
        throw new ArgumentOutOfRangeException((index < 0) ? "index" : "length", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
    }
    if ((array.Length - (index - array.GetLowerBound(0))) < length)
    {
        throw new ArgumentException(Environment.GetResourceString("Argument_InvalidOffLen"));
    }
    if (array.Rank != 1)
    {
        throw new RankException(Environment.GetResourceString("Rank_MultiDimNotSupported"));
    }
    if (!TrySZReverse(array, index, length))
    {
        int num = index;
        int num2 = (index + length) - 1;
        object[] objArray = array as object[];
        if (objArray == null)
        {
            while (num < num2)
            {
                object obj3 = array.GetValue(num);
                array.SetValue(array.GetValue(num2), num);
                array.SetValue(obj3, num2);
                num++;
                num2--;
            }
        }
        else
        {
            while (num < num2)
            {
                object obj2 = objArray[num];
                objArray[num] = objArray[num2];
                objArray[num2] = obj2;
                num++;
                num2--;
            }
        }
    }
}

TrySZReverse — это нативный метод, который иногда может делать то же самое, только быстрее.

person Sky Sanders    schedule 19.05.2010

Цикл от начальной точки index до середины диапазона index + length/2, меняя местами array[i] на array[index + length - i - 1].

person Marcelo Cantos    schedule 19.05.2010

Некоторые подробности о нативном методе "TrySZReverse"

из связанных кодов из coreclr([1][2]), TrySZReverse обрабатывает массив примитивных типов, а обратный алгоритм такой же, как у Array.Reverse:

котировка кодов

    static void Reverse(KIND array[], UINT32 index, UINT32 count) {
        LIMITED_METHOD_CONTRACT;

        _ASSERTE(array != NULL);
        if (count == 0) {
            return;
        }
        UINT32 i = index;
        UINT32 j = index + count - 1;
        while(i < j) {
            KIND temp = array[i];
            array[i] = array[j];
            array[j] = temp;
            i++;
            j--;
        }
    }

а префикс «SZ», по-видимому, означает «одномерный с нулевым окончанием».

person tkokof    schedule 29.04.2019