F # มีลำดับที่อนุญาตให้สร้างลำดับ:
seq { 0 .. 10 }
สร้างลำดับของตัวเลขตั้งแต่ 0 ถึง 10
มีบางอย่างที่คล้ายกันใน C # หรือไม่?
F # มีลำดับที่อนุญาตให้สร้างลำดับ:
seq { 0 .. 10 }
สร้างลำดับของตัวเลขตั้งแต่ 0 ถึง 10
มีบางอย่างที่คล้ายกันใน C # หรือไม่?
คำตอบ:
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
ปล. แต่ระวัง'indexes from end'ด้วย ตัวอย่างเช่นวิธีขยาย ToEnumerable var seq = ^2..^0
ไม่ได้ทำงานกับ
การใช้งานของฉัน:
private static IEnumerable<int> Sequence(int start, int end)
{
switch (Math.Sign(end - start))
{
case -1:
while (start >= end)
{
yield return start--;
}
break;
case 1:
while (start <= end)
{
yield return start++;
}
break;
default:
yield break;
}
}
เดิมตอบที่นี่ .
หากคุณต้องการแจกแจงลำดับของตัวเลข ( 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;
}
}
ซึ่งจะช่วยลดบางส่วนสำหรับรหัส (i)
IEnumerable<int>
.ToArray()