อัปเดต: นี่คือคำถามที่คล้ายกัน
สมมติว่าฉันมี DataTable
โดยมี DataRows
สองสามพันอยู่ในนั้น
ฉันต้องการแบ่งตารางออกเป็นแถวเล็กๆ เพื่อประมวลผล
ฉันคิดว่าความสามารถที่ดีขึ้นในการทำงานกับข้อมูลของ C#3 อาจช่วยได้
นี่คือโครงกระดูกที่ฉันมี:
DataTable Table = GetTonsOfData();
// Chunks should be any IEnumerable<Chunk> type
var Chunks = ChunkifyTableIntoSmallerChunksSomehow; // ** help here! **
foreach(var Chunk in Chunks)
{
// Chunk should be any IEnumerable<DataRow> type
ProcessChunk(Chunk);
}
มีข้อเสนอแนะเกี่ยวกับสิ่งที่ควรแทนที่ ChunkifyTableIntoSmallerChunksSomehow
หรือไม่
ฉันสนใจจริงๆ ว่าใครบางคนจะทำสิ่งนี้ด้วยเครื่องมือเข้าถึง C#3 ได้อย่างไร หากการพยายามใช้เครื่องมือเหล่านี้ไม่เหมาะสม โปรดอธิบาย!
อัปเดต 3 (แก้ไขส่วนที่ฉันต้องการตารางจริงๆ ไม่ใช่นับไม่ถ้วน ใช้วิธีการขยาย - ขอบคุณ Jacob):
การใช้งานขั้นสุดท้าย:
วิธีการขยายเพื่อจัดการกับการแบ่งส่วน:
public static class HarenExtensions
{
public static IEnumerable<DataTable> Chunkify(this DataTable table, int chunkSize)
{
for (int i = 0; i < table.Rows.Count; i += chunkSize)
{
DataTable Chunk = table.Clone();
foreach (DataRow Row in table.Select().Skip(i).Take(chunkSize))
{
Chunk.ImportRow(Row);
}
yield return Chunk;
}
}
}
ตัวอย่างผู้บริโภคของวิธีการขยายนั้น พร้อมเอาต์พุตตัวอย่างจากการทดสอบเฉพาะกิจ:
class Program
{
static void Main(string[] args)
{
DataTable Table = GetTonsOfData();
foreach (DataTable Chunk in Table.Chunkify(100))
{
Console.WriteLine("{0} - {1}", Chunk.Rows[0][0], Chunk.Rows[Chunk.Rows.Count - 1][0]);
}
Console.ReadLine();
}
static DataTable GetTonsOfData()
{
DataTable Table = new DataTable();
Table.Columns.Add(new DataColumn());
for (int i = 0; i < 1000; i++)
{
DataRow Row = Table.NewRow();
Row[0] = i;
Table.Rows.Add(Row);
}
return Table;
}
}