J'avais besoin d'un double [] scission en groupes d'éléments x par stride y renvoyant une liste. Assez basique ... une boucle et/ou un peu de linq et tout votre ensemble. Cependant, je n'ai pas passé beaucoup de temps sur les méthodes de vulgarisation et cela semblait être un bon candidat pour une pratique. La la version naïve retourne ce que je cherche dans mon application actuelle ....Comment rendre la méthode d'extension [exemple] plus générique/fonctionnelle/efficace?
(A)
public static IList<T[]> Split<T>(this IEnumerable<T> source, int every, int take)
{
/*... throw E if X is insane ...*/
var result = source
.Where ((t, i) => i % every == 0)
.Select((t, i) => source.Skip(i * every).Take(take).ToArray())
.ToList();
return result;
}
... le type de retour est une sorte de générique ... en fonction de votre définition de générique.
Je pense ...
(B)
public static IEnumerable<IEnumerable<T>> Split<T>
(this IEnumerable<T> source,int every, int take){/*...*/}
... est une meilleure solution ... peut-être.
Question (s):
- Est (B) préféré ... Pourquoi?
- Comment composeriez-vous (B) en tant que
IList <T[]>
? - Un avantage dans le refactoring? éventuellement deux méthodes qui pourraient être chaînées ou similaires.
- L'approche est-elle sonore? ... ou ai-je manqué quelque chose de basique?
Commentaires, opinions et langage dur sont toujours appréciés.
Contexte d'utilisation: C# .Net 4.0
Pourquoi appeler 'Cast' au lieu de simplement supprimer les appels' ToArray' et 'ToList'? – jball
@jball: Il y a une différence légitime si vous voulez exécuter la requête avec impatience. – Ani
@Ani, il semble défier les attentes de LINQ et les méthodes d'extension pour faire une méthode d'extension qui s'exécute avec impatience. – jball