Respostas:
Enumerable.Range(0, 11);
Gera uma sequência de números inteiros dentro de um intervalo especificado.
http://msdn.microsoft.com/en-us/library/system.linq.enumerable.range.aspx
Você pode criar uma função simples. Isso funcionaria para uma sequência mais complicada. Caso contrário, o Enumerable.Range
deve servir.
IEnumerable<int> Sequence(int n1, int n2)
{
while (n1 <= n2)
{
yield return n1++;
}
}
OddSequence
EvenSequence
ou outros intervalos personalizados. if (++n1 % 2 == 0) yield return n1
, por exemplo. Já se passaram alguns dias;)
Projeção Linq com a sobrecarga do indexador raramente usada (i) :
(new int[11]).Select((o,i) => i)
Eu prefiro este método por sua flexibilidade.
Por exemplo, se eu quiser pares:
(new int[11]).Select((item,i) => i*2)
Ou se eu quiser incrementos de 5 minutos de uma hora:
(new int[12]).Select((item,i) => i*5)
Ou strings:
(new int[12]).Select((item,i) => "Minute:" + i*5)
Em C # 8.0 você pode usar índices e intervalos
Por exemplo:
var seq = 0..2;
var array = new string[]
{
"First",
"Second",
"Third",
};
foreach(var s in array[seq])
{
System.Console.WriteLine(s);
}
// Output: First, Second
Ou se você quiser criar IEnumerable<int>
, você pode usar a extensão:
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 Mas tenha cuidado com os 'índices do fim' . Por exemplo, o método de extensão ToEnumerable não está funcionando var seq = ^2..^0
.
Respondido originalmente aqui .
Se você quiser enumerar uma sequência de números ( IEnumerable<int>
) de 0
para uma variável end
, tente
Enumerable.Range(0, ++10);
Na explicação, para obter uma sequência de números de 0 a 10, você deseja que a sequência comece em 0 (lembrando que existem 11 números entre 0 e 10, inclusive).
Se você quiser uma série linear ilimitada, pode escrever uma função como
IEnumerable<int> Series(int k = 0, int n = 1, int c = 1)
{
while (true)
{
yield return k;
k = (c * k) + n;
}
}
que você poderia usar como
var ZeroTo1000 = Series().Take(11);
Se você quiser uma função que possa chamar repetidamente para gerar números crescentes, talvez queira algo como.
using System.Threading;
private static int orderNumber = 0;
int Seq()
{
return Interlocked.Increment(ref orderNumber);
}
Quando você ligar, Seq()
ele retornará o próximo número do pedido e aumentará o contador.
Eu tenho essas funções no meu código
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;
}
}
Isso ajuda a reduzir parte do código (i).
IEnumerable<int>
, inclua uma chamada.ToArray()
.