Array.Reverse()方法背后的逻辑

问题描述:

public static void Reverse(Array array,int index,int length);Array.Reverse()方法背后的逻辑

+1

有了这个话题的两个正确的答案,所有剩下给我的是建议“.NET反射器”给你......利用这个工具,你可以自己分解这个方法。 (或者你可以下载.NET资源) – Hinek 2010-05-19 14:35:39

从起始点index环路到范围的中间index + length/2,将每个array[i]array[index + length - i - 1]交换。

您可以使用.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是一个本地方法,有时可以做同样的事情,只是速度更快。