Установите то же значение для массива / списка без использования цикла for

#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;
    }
}