#c# #arrays
#c# #массивы
Вопрос:
Я хочу установить одно и то же значение для определенного диапазона массива или списка без использования цикла. Это будет выглядеть следующим образом:
int[] myArray = new int[100];
int lower = 20;
int upper = 80;
int value = 5;
myArray.Method(lower,upper,value);
Я пробовал myArray.SetValue()
и также myList.InsertRange()
, но это позволяет установить только одно значение, а не диапазон.
Выполняет ли какой-либо C #-метод эту задачу? Можно ли это сделать без цикла?
Комментарии:
1.
for
Цикл кажется очевидным выбором. Что в этом плохого?2. Вы ищете существующее рамочное решение или можно создать свой собственный метод расширения?
3. Вы собираетесь каким-то образом использовать цикл, вопрос только в том, где вы его спрячете.
4. @sloth Мне просто любопытно. Это случается так часто, что я заменяю свои циклы for методами, которые я раньше не знал…
Ответ №1:
Ну, вы могли бы создать временный массив нужного размера и скопировать его в свой исходный массив
Array.Copy(Enumerable.Repeat(value, upper-lower 1).ToArray(), 0,
myArray, lower, upper-lower 1);
но это очень неэффективно (и внутренне тоже Enumerable.Repeat
использует цикл)
Я не вижу, что не так с простым for
циклом:
for(int i = lower; i <= upper; i )
myArray[i] = value;
Ответ №2:
Вам где-то требуется цикл, потому что оборудование, на котором вы работаете, скорее всего, не поддерживает этот тип операций.
Вот общий метод расширения, который будет работать со всеми типами массивов в соответствии с вашей спецификацией:
class Program
{
static void Main(string[] args)
{
int[] ints = new int[5];
ints.UpdateRange(2, 4, 5);
//ints has value [0,0,5,5,0]
}
}
public static class ArrayExtensions
{
public static void UpdateRange<T>(this T[] array, int lowerBound, int exclusiveUpperBound, T value)
{
Contract.Requires(lowerBound >= 0, "lowerBound must be a positive number");
Contract.Requires(exclusiveUpperBound > lowerBound, "exclusiveUpperBound must be greater than lower bound");
Contract.Requires(exclusiveUpperBound <= array.Length, "exclusiveUpperBound must be less than or equal to the size of the array");
for (int i = lowerBound; i < exclusiveUpperBound; i ) array[i] = value;
}
}