Мне нужен список целых чисел от 1 до x, где x задается пользователем. Я мог бы построить его с помощью цикла for, например, если предположить, что x является целым числом, установленным ранее:
List<int> iList = new List<int>();
for (int i = 1; i <= x; i++)
{
iList.Add(i);
}
Это кажется глупым, конечно, есть более элегантный способ сделать это, что-то вроде Метод диапазона PHP





LINQ спешит на помощь:
// Adding value to existing list
var list = new List<int>();
list.AddRange(Enumerable.Range(1, x));
// Creating new list
var list = Enumerable.Range(1, x).ToList();
См. Операторы генерации на LINQ 101
Если вы используете .Net 3.5, Enumerable.Range - это то, что вам нужно.
Generates a sequence of integral numbers within a specified range.
как правило, лучше использовать IEnumerable <> везде, где это возможно, для максимальной гибкости. особенно, если этот список не меняет, скорее всего, это не должен быть общий List <T>
Почему метод диапазона более элегантен, чем простой цикл for с условным значением max?
IMHO совершенно очевидно, что var List = new List <int> (Max - Min); для (var Index = Min; Index <Max; ++ Index) List.Add (Index); не так элегантен, как Enumerable.Range (Min, Max);
Я один из многих, у кого есть блоггинг о рубиновом методе расширения К, который вы можете написать, если используете C# 3.0:
public static class IntegerExtensions
{
public static IEnumerable<int> To(this int first, int last)
{
for (int i = first; i <= last; i++)
{
yield return i;
}
}
}
Затем вы можете создать свой список целых чисел, подобный этому
List<int> = first.To(last).ToList();или же
List<int> = 1.To(x).ToList();Другие ответы, скорее всего, именно то, что искал вопрошающий, но я проголосовал здесь, потому что мне нравится полученный синтаксис. Насколько читабельнее вы можете получить, чем "1.To (10)"?
Вот короткий метод, который возвращает список целых чисел.
public static List<int> MakeSequence(int startingValue, int sequenceLength)
{
return Enumerable.Range(startingValue, sequenceLength).ToList<int>();
}
Это вернет IEnumerable <int>, а не List <int>, поэтому, как заметил aku, вы захотите вызвать .ToList () при вызове Enumerable.Range (x, y).