Je voudrais diviser une liste dans les parties, | item 1 | item 2 | item 3 |
| item 4 | item 5 | item 6 |
| item 7 | item 8 | item 9 |
3 Réponses :
avec .take () et . Skip () Vous pouvez:
| item 1 | item 4 | item 7 | item 9 | | item 2 | item 5 | item 8 | item 10| | item 3 | item 6 | | |
Le code est bon mais je voulais une fonction qui diviserait de liste dans le nombre de pièces que je veux. Ma question n'était pas très claire à ce sujet et j'ai mis à jour la description pour montrer plus précisément ce que je voulais faire. Désolé pour ça!
@Alexandrejobin J'ai mis à jour la réponse. Est-ce que c'est ce que vous vouliez dire?
@Alexandrejobin Je dois dire que je ne sais pas tout à fait où et pourquoi on dirigerait une liste de cette manière, mais c'est un peu intrigant =)
@jesseShouwing Yepp, il fut fin soir pour moi quand je l'ai écrit. J'ai mis à jour la méthode afin qu'elle ne puisse pas itérer la liste tant de fois. Cependant, je crois qu'il est inévitable de itération à travers la liste, au moins une fois, d'obtenir le résultat souhaité.
@Mario J'ai mis à jour ma description pour afficher un véritable scénario où j'ai besoin de scinder ma liste dans les pièces verticales. Merci pour votre code, ça marche génial!
Utiliser Vous pouvez également utiliser .take (#ofelements) code> Pour spécifier le nombre d'éléments que vous souhaitez prendre. p>
.first code> et .Last code> p>
.first code> ne renvoiait qu'une seule valeur (dans ce cas 1 code> si aucun prédicat) et le même va pour .Last code> (sauf que ce serait 9 code> si aucun prédicat).
c'est parfait mon cher watson!
Cela semble faire le truc assez bien. Cela peut probablement être fait encore plus efficace, mais c'était assez puzzlant ... il est beaucoup plus facile de faire: que: p> J'ai d'abord ignoré la demande Linq, car j'ai eu du mal à m'envelopper la tête autour de lui. La solution utilisant la manipulation normale de la matrice pourrait entraîner quelque chose comme ceci: P> //WARNING: Iterates the IEnumerable twice
public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> list, int parts)
{
int itemOnIndex = 0;
int itemCount = list.Count();
int itemsOnlastRow = itemCount - ((itemCount / parts) * parts);
int numberOfRows = (int)(itemCount / (decimal)parts) + 1;
int firstblock = (numberOfRows*itemsOnlastRow);
var splits = from item in list
group item by (itemOnIndex++ < firstblock) ? ((itemOnIndex -1) % numberOfRows) : ((itemOnIndex - 1 - firstblock) % (numberOfRows - 1)) into row
orderby row.Key
select row.AsEnumerable();
return splits;
}
Donc, vous voulez la première moitié dans une liste, la seconde moitié dans une autre. Vous savez combien d'éléments sont dans la liste ... Peut-être que vous pourriez essayer de créer une liste et d'insérer la première moitié des éléments dans cette nouvelle liste ... Hmmm ...
var list1 = A.take (A.Longueur / 2) .tolist (); var list2 = A.SKIP (list1.count) .tolist (); code>Vous souhaitez vous scinder en 2 listes de longueur égales (similaires), des longueurs de pages fixes ou une valeur de contenu divisée? Vous recherchez également la possibilité de gérer des ensembles infinis ou des collections fixes? (Évidemment, il n'est pas possible de diviser un ensemble infini en deux)
@Matthewwhited Je voudrais que je voudrais diviser dans une liste de longueur similaire égale. J'ai mis à jour ma question à montrer plus précisément ce que je veux.
@Iliag Le code est bon, mais cela ne fonctionnera que si je le veux divisée dans 2. Et si je le veux en 3 parties?
@Alexandrejobin qui ressemble à un changement trivial du code donné. Vous devez calculer la longueur et les décalages pour vos sublistes, puis prenez la valeur de valorisation à l'aide de Skip () et de prendre ()
Dupliquer possible de Qu'est-ce qu'un moyen propre de rompre un jeu de données en morceaux de taille fixe avec linq?
@Oliver, il semblerait au premier coup d'œil, mais le résultat que l'OP veut, diffère de cette question et par exemple cette question .
Dupliqué exact de Split C # Collection en parties égales, maintien de tri a>