10
votes

LINQ: Comment grouper par nombre maximum d'éléments

Contexte
  • J'ai une liste d'articles (ou de longueur arbitraire). Je voudrais les regrouper dans des "morceaux" d'une certaine taille
  • Exemple: J'ai 12 clients [0,1,2,3,4,5,6,7,8,9,10,11] et souhaitons regrouper des morceaux de 5 morceaux de 5 qui donneraient [0,1, 2,3,4] [5,6,7,8,9] [10,11]
  • Note: En réalité, je ne travaille pas avec des clients ou des entiers croissants monotoniquement. J'ai choisi que juste pour simplifier poser la question

    Ma question

    Comment puis-je formuler une requête LINQ simple (à l'aide de la syntaxe de requête) qui effectue ce groupe?

    Fond
    • Je connais déjà comment utiliser la syntaxe Linq pour le regroupement par une valeur par exemple (pour regrouper les ventes de la clientèle), mais je suis à perte de manière à exprimer la "chunking" propre / élégante à l'aide de LINQ. Je ne suis pas sûr que si c'est même possible de manière simple.
    • Je peux et j'ai déjà implémenté une solution dans un # plain-c # sans utiliser la syntaxe LINQ. Ainsi, mon problème n'est pas bloqué sur cette question, mais je cherche plutôt des moyens de l'exprimer à Linq (à nouveau propre et élégamment)


1 commentaires

4 Réponses :


11
votes

Vous pouvez les grouper par (index / chunksize). Exemple: xxx


2 commentaires

C'est l'un de ces rares cas où une plaine de boucle et un dictionnaire est plus courte et plus compréhensible que Linq ...


Belle solution! Très utile!



4
votes

Pour ceux qui préfèrent les méthodes Linq (avec des expressions Lambda), voici Réponse de Dimitriy Maveev converti: Xxx

Si vous n'avez besoin que d'un tableau de valeur , au lieu d'un igrrouping , puis appendez ce qui suit: xxx


0 commentaires

0
votes

Pour faire le regroupement réel, ne devrait-il pas être:

var result = array
.Select((value, index) => new { Value = value, Index = index})
.GroupBy(i => i.Index / chunk, v => v.Value);


1 commentaires

Steven - tu es correct. J'ai mis à jour ma réponse. Merci d'avoir attrapé ça. Aussi, veuillez noter que Stackoverflow (Stackexchange dans son ensemble aussi) n'est pas un style de forum, où vous répondez à la réponse "ci-dessus". Vous avez posé pour répondre à la question. Je me rends compte que vous n'avez probablement pas eu assez de représentant pour ajouter un commentaire. Donc, de toute façon, essayez simplement d'aider.



1
votes

Méthode d'extension (en utilisant La réponse de Jesse ): xxx


0 commentaires