Risposte:
Enumerable.Range(0, 11);
Genera una sequenza di numeri interi all'interno di un intervallo specificato.
http://msdn.microsoft.com/en-us/library/system.linq.enumerable.range.aspx
Potresti creare una semplice funzione. Questo funzionerebbe per una sequenza più complicata. Altrimenti Enumerable.Range
dovrebbe fare.
IEnumerable<int> Sequence(int n1, int n2)
{
while (n1 <= n2)
{
yield return n1++;
}
}
OddSequence
EvenSequence
o altre gamme personalizzate. if (++n1 % 2 == 0) yield return n1
, per esempio. Sono passati alcuni giorni;)
Proiezione di Linq con il sovraccarico dell'indicizzatore usato raramente (i) :
(new int[11]).Select((o,i) => i)
Preferisco questo metodo per la sua flessibilità.
Ad esempio, se voglio uniformi:
(new int[11]).Select((item,i) => i*2)
O se voglio incrementi di 5 minuti di un'ora:
(new int[12]).Select((item,i) => i*5)
O stringhe:
(new int[12]).Select((item,i) => "Minute:" + i*5)
In C # 8.0 è possibile usare indici e intervalli
Per esempio:
var seq = 0..2;
var array = new string[]
{
"First",
"Second",
"Third",
};
foreach(var s in array[seq])
{
System.Console.WriteLine(s);
}
// Output: First, Second
O se vuoi creare IEnumerable<int>
, puoi usare l'estensione:
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 Ma fai attenzione agli "indici dalla fine" . Ad esempio, il metodo di estensione ToEnumerable non funziona con var seq = ^2..^0
.
Originariamente risposto qui .
Se vuoi enumerare una sequenza di numeri ( IEnumerable<int>
) da 0
a una variabile end
, prova
Enumerable.Range(0, ++10);
Spiegando, per ottenere una sequenza di numeri da 0 a 10, vuoi che la sequenza inizi da 0 (ricordando che ci sono 11 numeri compresi tra 0 e 10 inclusi).
Se vuoi una serie lineare illimitata, potresti scrivere una funzione come
IEnumerable<int> Series(int k = 0, int n = 1, int c = 1)
{
while (true)
{
yield return k;
k = (c * k) + n;
}
}
che potresti usare come
var ZeroTo1000 = Series().Take(11);
Se vuoi una funzione che puoi chiamare ripetutamente per generare numeri incrementali, forse vuoi qualcosa di simile.
using System.Threading;
private static int orderNumber = 0;
int Seq()
{
return Interlocked.Increment(ref orderNumber);
}
Quando lo chiami Seq()
, restituirà il numero dell'ordine successivo e incrementerà il contatore.
Ho queste funzioni nel mio codice
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;
}
}
Questo aiuta a ridurre un po 'di codice per (i).
IEnumerable<int>
, includere una chiamata.ToArray()
.