Cập nhật: Dưới đây là một similar questionCách sạch sẽ để chia nhỏ DataTable thành các khối có kích thước cố định bằng LINQ là gì?
Giả sử tôi có một DataTable
với một vài ngàn DataRows
trong đó.
Tôi muốn chia bảng thành nhiều hàng nhỏ hơn để xử lý.
Tôi nghĩ khả năng làm việc với dữ liệu của C# 3 có thể hữu ích.
Đây là bộ xương tôi có cho đến nay:
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);
}
Mọi góp ý về những gì nên thay thế ChunkifyTableIntoSmallerChunksSomehow
?
Tôi thực sự quan tâm đến cách một người nào đó sẽ thực hiện việc này bằng các công cụ truy cập C# 3. Nếu cố gắng áp dụng những công cụ này là không phù hợp, hãy giải thích!
Cập nhật 3 (sửa đổi chunking như tôi thực sự muốn bảng, không IEnumerables; đi với một phương pháp khuyến nông - nhờ Jacob):
thi cuối cùng:
phương pháp mở rộng để xử lý các chunking:
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;
}
}
}
Ví dụ người tiêu dùng rằng phương pháp khuyến nông, với sản lượng mẫu từ một thử nghiệm quảng cáo hoc:
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;
}
}
Tôi không sử dụng để phân trang nhưng tôi vừa nhận ra ứng dụng song song. Nếu bạn tìm thấy bất kỳ bản sao tốt nào áp dụng ở đây, vui lòng cho tôi biết và tôi sẽ đóng câu hỏi. –
Bạn có thể nội tuyến bằng cách tạo phương thức tiện ích mở rộng thực hiện ở trên. Sau đó, bạn có thể sử dụng var Chunks = từ đoạn trong bảng.Chọn lại chọn đoạn; –
Tôi thích ý tưởng đó, cảm ơn –