Élégamment passant des listes et des objets comme paramètres
En C#, on peut utiliser la params
mot-clé pour spécifier un nombre arbitraire de paramètres typés à une méthode:
public void DoStuff(params Foo[] foos) {...}
public void OtherStuff {
DoStuff(foo1);
DoStuff(foo2, foo3);
}
Si vous avez déjà une liste d'objets, vous pouvez le transformer en un tableau de passer à cette méthode:
DoStuff(fooList.ToArray());
Cependant, est-il une manière élégante de mix-n-match? C'est, pour passer dans de multiples objets et des listes d'objets et les résultats sont aplaties dans une liste ou un tableau pour vous? Idéalement, je voudrais être en mesure de téléphoner à ma méthode comme ceci:
DoStuff(fooList, foo1, foo2, anotherFooList, ...);
De plein droit maintenant, la seule façon que je sais comment faire c'est pour pré-traiter le tout dans une seule liste, et je ne sais pas de toute façon de le faire d'une manière générique.
Edit: Pour être clair, je ne suis pas marié à la params
mot-clé, c'est juste un mécanisme qui m'a aidé à expliquer ce que je voulais faire. Je suis très heureux avec n'importe quelle solution qui a l'air propre et aplatit le tout dans une seule liste.
params
sauf si vraiment nécessaire.J' j'espère il n'y a aucun moyen de mélanger et assortir. Comment le compilateur de savoir si vous vouliez aplatir un objet qui est un tableau d'objets? Faut-il aplatir un tableau de tableaux d'objets? Comment pourrait-il éventuellement décider du moment d'aplatir et quand ne pas le faire?
Je ne suis pas tout à fait clair sur ce que votre objectif ou de motivation, mais, la documentation de params msdn.microsoft.com/en-us/library/w5zay9db.aspx montre l'utilisation d'un tableau de type comme dans
public static void UseParams2(params object[] list)
OriginalL'auteur ean5533 | 2013-08-05
Vous devez vous connecter pour publier un commentaire.
Vous pouvez créer une classe avec implict conversions pour envelopper un seul élément et une liste:
ensuite, vous pouvez changer votre
DoStuff
méthode:Ah, C'est le genre de réponse que je cherchais. Non pas parce que je veux l'utiliser dans la production, mais parce que je savais que intelligent réponses à ce problème pourrait m'enseigner quelque chose de nouveau. Excellent, merci.
Pourquoi ne pas aller dans le code de production?
OriginalL'auteur
Vous pouvez utiliser Énumérable.Concat de rejoindre plusieurs listes et les éléments, comme:
Remarque: il y a probablement beaucoup plus lisible des moyens pour réaliser tout ce que vous essayez de faire. Même en passant
IEnumerable<Foo>
est plus lisible.OriginalL'auteur
Vous ne pouvez pas vraiment faire ce que vous essayez de faire, mais avec une méthode d'extension, vous pouvez obtenir à peu près:
OriginalL'auteur
vous pourriez faire de méthodes distinctes pour charger les objets dans la même collection, non pas qu'élégant, mais il va travailler, et la logique est vraiment facile à suivre, et pas très difficile à mettre en œuvre.
List<Foo>
et à l'aide deAdd
etAddRange
.OriginalL'auteur