/// <summary> /// 将数组从指定的索引位置开始使用指定的函数的返回值填充指定的长度。 /// </summary> /// <param name="array">要填充的数组。</param> /// <param name="value">返回要填充数组指定索引的值的函数,其参数是当前填充到的索引。</param> /// <param name="startIndex">要开始填充的起始索引。</param> /// <param name="length">要填充的数组元素个数。</param> /// <returns>填充完毕的数组。</returns> /// <exception cref="System.ArgumentNullException"><paramref name="array"/> 为 <c>null</c>。</exception> /// <exception cref="System.ArgumentNullException"><paramref name="value"/> 为 <c>null</c>。</exception> /// <exception cref="System.ArgumentOutOfRangeException"><paramref name="startIndex"/> /// 加 <paramref name="length"/> 之和大于数组的长度。</exception> /// <exception cref="System.ArgumentOutOfRangeException"><paramref name="startIndex"/> /// 或 <paramref name="length"/> 小于零。</exception> public static Array Fill(this Array array, Func <int, object> value, int startIndex, int length) { if (array == null) { throw ExceptionHelper.ArgumentNull("array"); } if (value == null) { throw ExceptionHelper.ArgumentNull("value"); } if (startIndex < 0) { throw ExceptionHelper.ArgumentOutOfRange("startIndex"); } if (length < 0 || startIndex + length > array.Length) { throw ExceptionHelper.ArgumentOutOfRange("length"); } Contract.Ensures(Contract.Result <Array>() != null); return(FillInternal(array, value, startIndex, length)); }
/// <summary> /// 从当前数组的指定索引开始截取一部分。 /// 如果 <paramref name="startIndex"/> 小于 <c>0</c>,那么表示从数组末尾向前计算的位置。 /// </summary> /// <typeparam name="T">数组中元素的类型。</typeparam> /// <param name="array">要截取的数组。</param> /// <param name="startIndex">要截取的起始索引。</param> /// <returns>截取得到的数组。如果 <paramref name="startIndex"/> /// 等于数组的长度,则为空数组。</returns> /// <exception cref="System.ArgumentNullException"> /// <paramref name="array"/> 为 <c>null</c>。</exception> /// <exception cref="System.ArgumentOutOfRangeException"> /// <paramref name="startIndex"/> 指示的位置不在此数组中。</exception> /// <overloads> /// <summary> /// 从当前数组的指定索引开始截取一部分。 /// </summary> /// </overloads> public static T[] Slice <T>(this T[] array, int startIndex) { if (array == null) { throw ExceptionHelper.ArgumentNull("array"); } if (startIndex < -array.Length || startIndex >= array.Length) { throw ExceptionHelper.ArgumentOutOfRange("startIndex"); } Contract.Ensures(Contract.Result <T[]>() != null); if (startIndex == array.Length) { return(Empty <T>()); } if (startIndex < 0) { startIndex += array.Length; } return(SubarrayInternal(array, startIndex, array.Length)); }
/// <summary> /// 从当前数组的右端截取一部分。 /// </summary> /// <typeparam name="T">数组中元素的类型。</typeparam> /// <param name="array">从该数组返回其最右端截取的部分。</param> /// <param name="length">要截取的元素个数。 /// 如果为 <c>0</c>,则返回空数组。如果大于或等于 <paramref name="array"/> 的长度, /// 则返回整个数组的一个浅拷贝。</param> /// <returns>从指定数组的右端截取的部分。</returns> /// <exception cref="System.ArgumentNullException"> /// <paramref name="array"/> 为 <c>null</c>。</exception> /// <exception cref="System.ArgumentOutOfRangeException"> /// <paramref name="length"/> 小于 <c>0</c>。</exception> public static T[] Right <T>(this T[] array, int length) { if (array == null) { throw ExceptionHelper.ArgumentNull("array"); } if (length < 0) { throw ExceptionHelper.ArgumentOutOfRange("length"); } Contract.Ensures(Contract.Result <T[]>() != null); if (length == 0) { return(Empty <T>()); } if (length > array.Length) { length = array.Length; } return(SubarrayInternal(array, array.Length - length, length)); }
/// <summary> /// 从当前数组的指定索引开始截取指定长度的一部分。 /// 如果 <paramref name="startIndex"/> 小于 <c>0</c>, /// 那么表示从字符串结束位置向前计算的位置。 /// </summary> /// <typeparam name="T">数组中元素的类型。</typeparam> /// <param name="array">要截取的数组。</param> /// <param name="startIndex">要截取的起始索引。</param> /// <param name="length">要截取的数组元素个数。</param> /// <returns>截取得到的数组。</returns> /// <exception cref="System.ArgumentOutOfRangeException"> /// <paramref name="startIndex"/> 加 <paramref name="length"/> /// 之和指示的位置不在此数组中。</exception> /// <exception cref="System.ArgumentOutOfRangeException"> /// <paramref name="startIndex"/> 小于负的此数组的长度。</exception> /// <exception cref="System.ArgumentOutOfRangeException"> /// <paramref name="length"/> 小于零。</exception> public static T[] Subarray <T>(this T[] array, int startIndex, int length) { if (array == null) { return(new T[0]); } if (startIndex < 0) { startIndex += array.Length; } if (startIndex < 0 || startIndex >= array.Length) { throw ExceptionHelper.ArgumentOutOfRange("startIndex"); } int len = startIndex + length; if (length < 0 || len > array.Length) { throw ExceptionHelper.ArgumentOutOfRange("length"); } return(SubarrayInternal(array, startIndex, len)); }