Yanıtlar:
Enumerable.Range(0, 11);
Belirli bir aralıkta bir dizi integral sayı üretir.
http://msdn.microsoft.com/en-us/library/system.linq.enumerable.range.aspx
Basit bir işlev oluşturabilirsiniz. Bu daha karmaşık bir sekans için işe yarar. Aksi takdirde Enumerable.Range
yapmalı.
IEnumerable<int> Sequence(int n1, int n2)
{
while (n1 <= n2)
{
yield return n1++;
}
}
OddSequence
EvenSequence
ya da diğer özel aralıkları düşünüyordum. if (++n1 % 2 == 0) yield return n1
, Örneğin. Birkaç gün oldu;)
Nadiren kullanılan aşırı indeksleyici (i) ile Linq projeksiyonu :
(new int[11]).Select((o,i) => i)
Bu yöntemi esnekliği için tercih ediyorum.
Örneğin, çiftler istiyorsam:
(new int[11]).Select((item,i) => i*2)
Veya bir saatlik 5 dakikalık artışlar istersem:
(new int[12]).Select((item,i) => i*5)
Veya dizeler:
(new int[12]).Select((item,i) => "Minute:" + i*5)
C # 8.0'da Endeksleri ve aralıkları kullanabilirsiniz
Örneğin:
var seq = 0..2;
var array = new string[]
{
"First",
"Second",
"Third",
};
foreach(var s in array[seq])
{
System.Console.WriteLine(s);
}
// Output: First, Second
Veya oluşturmak IEnumerable<int>
istiyorsanız, uzantıyı kullanabilirsiniz:
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
Not: Ancak 'sondan indekslere' dikkat edin . Örneğin, ToEnumerable genişletme yöntemi ile çalışmıyor var seq = ^2..^0
.
Aslen burada cevaplandı .
Bir değişkenten bir sayı dizisini ( IEnumerable<int>
) numaralandırmak istiyorsanız , şunu deneyin:0
end
Enumerable.Range(0, ++10);
Açıklamada, 0'dan 10'a kadar bir sayı dizisi elde etmek için, dizinin 0'dan başlamasını istersiniz (0 ile 10 arasında 11 sayı olduğunu hatırlayarak).
Sınırsız bir doğrusal dizi istiyorsanız, şöyle bir işlev yazabilirsiniz:
IEnumerable<int> Series(int k = 0, int n = 1, int c = 1)
{
while (true)
{
yield return k;
k = (c * k) + n;
}
}
hangi gibi kullanabilirsin
var ZeroTo1000 = Series().Take(11);
Bir işlev istiyorsanız, artan numaralar oluşturmak için tekrar tekrar arayabilirsiniz, belki de buna benzer bir şey istiyorsunuz.
using System.Threading;
private static int orderNumber = 0;
int Seq()
{
return Interlocked.Increment(ref orderNumber);
}
Aradığınızda Seq()
, bir sonraki sipariş numarasını döndürür ve sayacı artırır.
Kodumda bu işlevler var
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;
}
}
Bu, (i) kodunun bir kısmını azaltmaya yardımcı olur.
IEnumerable<int>
, bir mesaj eklemesi.ToArray()
.