Mise à jour : Voici un question similaire
Supposons que j'ai un DataTable
avec quelques milliers DataRows
en elle.
J'aimerais décomposer le tableau en morceaux de rangées plus petites pour le traitement.
J'ai pensé que la capacité améliorée de C#3 à travailler avec des données pourrait aider.
C'est le squelette que j'ai jusqu'à présent :
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);
}
Des suggestions sur ce qui devrait remplacer ChunkifyTableIntoSmallerChunksSomehow
?
Je suis vraiment intéressé de savoir comment quelqu'un pourrait faire cela avec les outils d'accès à C#3. Si la tentative d'application de ces outils est inappropriée, veuillez m'expliquer !
Mise à jour 3 (révision du chunking car je veux vraiment des tables, pas des ienumerables ; utilisation d'une méthode d'extension - merci Jacob) :
Mise en œuvre finale :
Méthode d'extension pour gérer le 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;
}
}
}
Exemple d'utilisation de cette méthode d'extension, avec un exemple de résultat d'un test ad 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;
}
}