Ответы:
Enumerable.Range(0, 11);
Создает последовательность целых чисел в указанном диапазоне.
http://msdn.microsoft.com/en-us/library/system.linq.enumerable.range.aspx
Вы можете создать простую функцию. Это подойдет для более сложной последовательности. В противном случае так и Enumerable.Range
должно быть.
IEnumerable<int> Sequence(int n1, int n2)
{
while (n1 <= n2)
{
yield return n1++;
}
}
OddSequence
EvenSequence
или другие настраиваемые диапазоны. if (++n1 % 2 == 0) yield return n1
, например. Прошло несколько дней;)
Проекция Linq с редко используемой перегрузкой индексатора (i) :
(new int[11]).Select((o,i) => i)
Я предпочитаю этот метод из-за его гибкости.
Например, если я хочу эвенов:
(new int[11]).Select((item,i) => i*2)
Или, если мне нужно 5-минутное приращение часа:
(new int[12]).Select((item,i) => i*5)
Или струны:
(new int[12]).Select((item,i) => "Minute:" + i*5)
В C # 8.0 вы можете использовать индексы и диапазоны
Например:
var seq = 0..2;
var array = new string[]
{
"First",
"Second",
"Third",
};
foreach(var s in array[seq])
{
System.Console.WriteLine(s);
}
// Output: First, Second
Или, если вы хотите создать, IEnumerable<int>
вы можете использовать расширение:
public static IEnumerable<int> ToEnumerable(this Range range)
{
for (var i = range.Start.Value; i < range.End.Value; i++)
{
yield return i;
}
}
...
var seq = 0..2;
foreach (var s in seq.ToEnumerable())
{
System.Console.WriteLine(s);
}
// Output: 0, 1
PS Но будьте осторожны с «индексами с конца» . Например, метод расширения ToEnumerable не работает с var seq = ^2..^0
.
Первоначально ответили здесь .
Если вы хотите перечислить последовательность чисел ( IEnumerable<int>
) от 0
до переменной end
, попробуйте
Enumerable.Range(0, ++10);
В пояснении, чтобы получить последовательность чисел от 0 до 10, вы хотите, чтобы последовательность начиналась с 0 (помня, что существует 11 чисел от 0 до 10 включительно).
Если вам нужен неограниченный линейный ряд, вы можете написать такую функцию, как
IEnumerable<int> Series(int k = 0, int n = 1, int c = 1)
{
while (true)
{
yield return k;
k = (c * k) + n;
}
}
который вы могли бы использовать как
var ZeroTo1000 = Series().Take(11);
Если вам нужна функция, которую можно вызывать несколько раз для генерации увеличивающихся чисел, возможно, вам нужно что-то вроде.
using System.Threading;
private static int orderNumber = 0;
int Seq()
{
return Interlocked.Increment(ref orderNumber);
}
При вызове Seq()
он вернет номер следующего заказа и увеличит счетчик.
В моем коде есть эти функции
private static IEnumerable<int> FromZero(this int count)
{
if (count <= 0)
yield break;
for (var i = 0; i < count; i++)
{
yield return i;
}
}
private static IEnumerable<int> FromOne(this int count)
{
if (count <= 0)
yield break;
for (var i = 1; i <= count; i++)
{
yield return i;
}
}
Это помогает сократить часть кода for (i).
IEnumerable<int>
, включите вызов.ToArray()
.