Возможный дубликат:
Автоинициализация списков C#У меня есть список целых чисел, который имеет определенную способность, которую я хотел бы автоматически заполнить при объявлении.
List
x = new List (10); Существует ли более легкий способ заполнить этот список 10 ints, которые имеют значение по умолчанию для интервала, а не цикличного выполнения через и добавления объектов?
Ну, вы можете попросить LINQ сделать цикл за вас:
List<int> x = Enumerable.Repeat(value, count).ToList();
Неясно, подразумеваете ли вы под "значением по умолчанию" 0 или пользовательское значение по умолчанию.
Вы можете сделать это немного более эффективным (по времени выполнения; в памяти это хуже), создав массив:
List<int> x = new List<int>(new int[count]);
Это сделает блочное копирование из массива в список, что, вероятно, будет более эффективно, чем циклическое выполнение, требуемое ToList
.
int defaultValue = 0;
return Enumerable.Repeat(defaultValue, 10).ToList();
Да
int[] arr = new int[10];
List<int> list = new List<int>(arr);
Если у вас есть список фиксированной длины и вы хотите, чтобы все элементы имели значение по умолчанию, то, возможно, вам следует просто использовать массив:
int[] x = new int[10];
В качестве альтернативы это может быть хорошим местом для пользовательского метода расширения:
public static void Fill<T>(this ICollection<T> lst, int num)
{
Fill(lst, default(T), num);
}
public static void Fill<T>(this ICollection<T> lst, T val, int num)
{
lst.Clear();
for(int i = 0; i < num; i++)
lst.Add(val);
}
и тогда вы можете даже добавить специальную перегрузку для класса List, чтобы заполнить его до отказа:
public static void Fill<T>(this List<T> lst, T val)
{
Fill(lst, val, lst.Capacity);
}
public static void Fill<T>(this List<T> lst)
{
Fill(lst, default(T), lst.Capacity);
}
Тогда вы можете просто сказать:
List<int> x = new List(10).Fill();
var count = 10;
var list = new List<int>(new int[count]);
ADD
Вот общий метод для получения списка со значениями по умолчанию:
public static List<T> GetListFilledWithDefaulValues<T>(int count)
{
if (count < 0)
throw new ArgumentException("Count of elements cannot be less than zero", "count");
return new List<T>(new T[count]);
}