Заполнить массив в С#
В Java существует около 18 статических "заполняющих" методов в массиве классов, которые служат для назначения одного значения каждому элементу в массиве. Я ищу эквивалент в С# для достижения того же, но я не нахожу ничего с такой же компактностью:
1) ForEach, поскольку я понимаю, передает элементы в массиве по значению, поэтому я не могу их изменить
2) Repeat from Enumerable создает новый массив, кажется, накладные расходы, чтобы создать новый массив, а затем скопировать каждый элемент из массива
3) for-loop не очень хорош, и я думаю, поэтому люди Java представили эту компактную нотацию, начиная с
4) Метод Clear из класса Array может установить все на ноль, но тогда как преобразовать нуль в ненулевое значение, которое я хочу?
Чтобы продемонстрировать синтаксис Java, рассмотрите этот код, который печатает три раза число 7:
int[] iii = {1, 2, 3};
Arrays.fill(iii, 7);
for (int i : iii) {
System.out.println(i);
}
Ответы
Ответ 1
Напишите себе метод расширения
public static class ArrayExtensions {
public static void Fill<T>(this T[] originalArray, T with) {
for(int i = 0; i < originalArray.Length; i++){
originalArray[i] = with;
}
}
}
и используйте его как
int foo[] = new int[]{0,0,0,0,0};
foo.Fill(13);
заполнит все элементы 13
Ответ 2
int[] arr = Enumerable.Repeat(42, 10000).ToArray();
Я считаю, что это делает работу:)
Ответ 3
Вы можете попробовать что-то вроде этого:
Я инициализировал массив для значения 5, вы можете поместить свой номер аналогичным образом.
int[] arr = new int[10]; // your initial array
arr = arr.Select(i => 5).ToArray(); // array initialized to 5.
Ответ 4
вы можете написать метод расширения
public static void Fill<T>(this T[] array, T value)
{
for(int i = 0; i < array.Length; i++)
{
array[i] = value;
}
}
Ответ 5
Предположим, вы хотите заполнить цифрой 13.
int[] myarr = Enumerable.Range(0, 10).Select(n => 13).ToArray();
или
List<int> myarr = Enumerable.Range(0,10).Select(n => 13).ToList();
если вы предпочитаете список.
Ответ 6
public static void Fill<T>(this IList<T> col, T value, int fromIndex, int toIndex)
{
if (fromIndex > toIndex)
throw new ArgumentOutOfRangeException("fromIndex");
for (var i = fromIndex; i <= toIndex; i++)
col[i] = value;
}
Что-то, что работает для всех IList<T>
s.