2013-08-13 4 views
1

J'ai une collection d'objets de voiture et je suis à la recherche à travers eux comme ceci:Quelle est la meilleure façon de diviser une collection en plus petites collections

var slide = CreateSlide(); 
foreach (var car in carCollection) { 
     displayonSlide(car, slide) 
} 

Je me rends compte maintenant que je ne peux adapter 5 voitures sur un glisser donc je dois prendre le carCollection et le diviser en collections de 5, puis faire la boucle à travers chacun de ces 5 (donc je crée une nouvelle diapositive pour chaque 5 voitures qui existent dans la collection

Quelle est la La meilleure façon de diviser une seule collection en un nombre de plus petite collection basé sur la commercialisation par un certain nombre d'articles (5 dans ce cas)

évidemment la dernière collection pourrait avoir le reste sinon divisible.

+1

@ByteBlast - pouvez-vous élaborer un peu sur la façon dont vous utiliserez prendre pour créer différents collectison – leora

+0

Au début, je pensais que l'utilisation d'une combinaison de '' Take' et Skip' serait la meilleure solution mais j'ai depuis changé d'avis :-p –

+0

Similaire à http://stackoverflow.com/questions/419019/split-list-into-sublists-with-linq Les réponses vont dans les détails sur la performance/memory tradeoff avec différentes implémentations. –

Répondre

3

J'utilise cette méthode d'extension pour mon code

public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> t, int size) 
{ 
    while (t.Any()) 
    { 
     yield return t.Take(size); 
     t = t.Skip(size); 
    } 
} 
+2

Il recommence depuis le début de la collection d'entrées. – MarcinJuraszek

+0

Comme @MarcinJuraszek dit, vous obtenez un nombre infini de premières pages. – Jodrell

0

LINQ:

var slides = carCollection 
     .Select((car, index) => new { car, index }) 
     .GroupBy(c => c.index/5) 
     .Select(g=> 
     { 
      var slide = CreateSlide(); 
      g.ToList().ForEach(c => displayonSlide(c.car, slide)); 
      return slide; 
     }).ToList(); 
0

Si votre collection est List, vous pouvez utiliser la méthode GetRange():

var input = new List<int> { 1, 5, 6, 7, 8, 9, 34, 14 }; 
var k = 5 

var res = Enumerable.Range(0, (input.Count - 1)/k + 1) 
        .Select(i => input.GetRange(i * k, Math.Min(k, input.Count - i * k))) 
        .ToList(); 
0

Pour éviter regroupement et maths,

IEnumerable<IEnumerable<T>> Partition<T>(this IEnumerable<T> source, int size) 
{ 
    var partition = new T[size]; 
    var count = 0; 

    foreach(var t in source) 
    { 
     partition[count] = t; 
     count ++; 

     if (count == size) 
     { 
      yield return partition; 
      var partition = new T[size]; 
      var count = 0; 
     } 
    } 

    if (count > 0) 
    { 
     return partition.Take(count); 
    } 
} 

pour que vous puissiez faire

cars.Partition(5).AsParallel().ForAll(pageSet => 
{ 
    var slide = CreateSlide(); 
    foreach(var car in pageSet) 
    { 
     DisplayOnSlide(car, slide); 
    } 
}); 
Questions connexes