Более короткий способ объявления и инициализации списка‹ushort›

В настоящее время я объявляю и инициализирую такой список:

List<ushort> myList = new List<ushort>() {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

В конечном итоге у меня будет больше списков ushort, которые будут содержать намного больше, чем 10 значений, и, например, неэффективно вводить каждое число от 1 до 100. Список всегда будет представлять собой диапазон чисел.

Есть ли более короткий способ написать это? Я пытался исследовать Enumerable.Range, но он обрабатывает только значения int, и я получаю сообщение об ошибке «Невозможно неявно преобразовать тип int в ushort».


person mccoyrjm    schedule 11.02.2014    source источник
comment
Использовать цикл for? Перечислимый.Диапазон(...).ToList() ?   -  person sircodesalot    schedule 11.02.2014
comment
Если вы собираетесь делать больше коротких списков, похоже, это будет повторяться много раз. Я предлагаю вам создать свой собственный статический фабричный метод, который использует ваши нижние и верхние границы для создания списка, и весь ваш код будет использовать этот фабричный метод. Таким образом, если вы захотите ввести более подробный, но более эффективный метод построения списка позже, или если вы передумаете использовать LINQ или что-то еще, это не имеет значения, потому что вы не повторяете сами; измените его в одном месте, и все будут довольны, и ваш код вызова станет для него проще.   -  person Chris Sinclair    schedule 11.02.2014


Ответы (2)


Как насчет явного приведения?

List<ushort> myList = Enumerable.Range(1, 100).Select(i => (ushort)i).ToList();

а потом сделать его очень коротким!

var myList = Enumerable.Range(1, 100).Select(i => (ushort)i).ToList();
person Andy Brown    schedule 11.02.2014
comment
Cast<> здесь не работает. Он не предназначен для такого преобразования. В основном он предназначен для преобразования идентификаторов и преобразования ссылок. (Я считаю, что до пакета обновлений это было бы работать здесь, но это было давно.) - person Jon Skeet; 11.02.2014
comment
@sircodesalot: Select — правильный подход, потому что он работает. - person Jon Skeet; 11.02.2014
comment
Черт, ты прав. : / Вот что я получаю за то, что пытаюсь быть забавным. - person sircodesalot; 11.02.2014
comment
Это именно то, что мне нужно, спасибо! Не могли бы вы объяснить .Select(i =› (ushort)i)? Предполагая, что он устанавливает «i» в качестве параметра int, а затем вы переводите его в ushort? - person mccoyrjm; 11.02.2014
comment
@McRealz: Вместо того, чтобы объяснять этот конкретный случай, я предлагаю вам прочитать LINQ и изучить общий случай. Если вы раньше не использовали LINQ, это будет настоящее удовольствие :) - person Jon Skeet; 11.02.2014
comment
@JonSkeet: спасибо за комментарий о приведении, я просто пробовал и получил хорошую ошибку времени выполнения InvalidCastException без предупреждения во время компиляции. - person Andy Brown; 11.02.2014
comment
@AndyBrown: вы не получите предупреждение во время компиляции - оно полностью действительно во время компиляции. - person Jon Skeet; 11.02.2014

Вы можете попробовать использовать цикл, чтобы заполнить свой список.

List<ushort> myList = new List<ushort>();

И затем используйте это в методе:

ushort count = 100; //or whatever number you need

for (ushort i = 1; i < count + 1; i++)
    myList.Add(i);

Одним из преимуществ циклов, imo, является то, что если в будущем у вас будет список чего-то, например классов, вы можете легко создавать разные экземпляры классов в цикле и добавлять их в список.

person davidsbro    schedule 11.02.2014