2010-10-27 2 views
1

comment diviser une séquence de nombres en sous-groupes de nombres et obtenir le minimum local et le maximum des sous-groupes avec linq?LINQ: Récupère les valeurs min et max de la séquence de nombres divisée en sous-séquences

Si j'ai une séquence de, disons 11 articles {3, 2, 5, 9, 9, 6, 7, 2, 5, 11, 2}
Je veux diviser cela en sous-groupes avec 3 ou moins d'articles.

donc je reçois les 4 sous-groupes suivants: {3, 2, 5}, {9, 9, 6}, {7, 2, 5}, {11, 2}

Les valeurs de retour finales de l'expression LinQ (obtention min et max pour chaque groupe) doit être de 2, 5, 6, 9, 2, 7, 2, 11

TIA, Sascha

+0

Vous avez '6' en deux groupes, et laissé tomber le' 5'. Que faire si vous avez un groupe d'un numéro? '{1,2,3} {4}'? – Kobi

+0

@Kobi: C'était probablement une faute de frappe, même si cela n'a pas affecté le résultat souhaité (pour autant que je sache). –

+0

Bien sûr, c'est une faute de frappe ':)' – Kobi

Répondre

4

Cela devrait le faire.

var numbers = new[] { 3, 2, 5, 9, 9, 6, 7, 2, 5, 11, 2 }; 
var query = from p in numbers.Select((n, i) => new { n, Group = i/3 }) 
      group p.n by p.Group into g 
      from n in new[] { g.Min(), g.Max() } 
      select n; 
3

Eh bien, en utilisant la méthode de BatchMoreLINQ pour faire le regroupement, vous pouvez utiliser:

var query = source.Batch(3, batch => new[] { batch.Min(), batch.Max() }) 
        .SelectMany(x => x); 
+0

Un point c'est que le dernier item sera doublé s'il est seul dans son groupe. '{1}' -> '{1,1}'. Bien sûr, cela correspond aux exigences. – Kobi

Questions connexes