2010-12-10 26 views
2

J'ai une collection de 55 valeurs de chaîne dans mon programme C#. Je veux que chaque groupe ait 20 objets (ou moins) de cette collection. Donc, cela signifie que j'aurai 3 groupes avec 20, 20 et 15 articles. Ensuite, pour chaque groupe, je dois appeler une méthode.Utilisation de Linq pour obtenir des groupes d'une collection

Comment réaliser cela en utilisant Linq?

Merci.

Répondre

7
List<string> strings = ... 
List<List<string>> groups = strings 
    .Select((s, idx) => new { Item = s, Group = idx/20 }) 
    .GroupBy(s => s.Group) 
    .Select(grp => grp.Select(g => g.Item).ToList()) 
    .ToList(); 
2

Vous pouvez créer une méthode d'extension similaire. Notez que je n'ai pas géré d'erreur null/vide source.

static class EnumerableExtensions { 
    public static IEnumerable<IEnumerable<T>> GetPages<T>(
     this IEnumerable<T> source, 
     int pageSize 
    ) { 
     var e = source.GetEnumerator(); 
     while(e.MoveNext()) { 
      int count = pageSize - 1; 
      List<T> list = new List<T>(pageSize) { e.Current }; 
      while (count > 0 && e.MoveNext()) { 
       list.Add(e.Current); 
       count--; 
      } 
      yield return list; 
     } 
    } 
} 

Puis:

IEnumerable<string> strings; 
var pages = strings.GetPages(20) 

Exemple:

var list = Enumerable.Range(0, 55).Select(x => x.ToString()).ToList(); 
foreach (var page in list.GetPages(20)) { 
    Console.WriteLine(page.Count()); 
} 

Sortie:

20 
20 
15 
+0

Est-ce pas provoquer une nouvelle IEnumerator pour être crea té pour chaque page? Semble plutôt inefficace, en tout cas, mais un tableau fixe minuscule. – Ken

+0

@Ken: Oui, j'ai répondu à cette préoccupation. S'il vous plaît voir mon edit. – jason