какова собственная логика работы public static void Reverse (массив массива, индекс int, длина int);
Логика метода Array.Reverse()
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