Comme le titre l'indique: Pourquoi string.Join
a besoin de prendre un tableau au lieu d'un IEnumerable? Cela continue de m'agacer, puisque je dois ajouter un .ToArray() quand j'ai besoin de créer une chaîne jointe à partir du résultat d'une expression LINQ. Mon expérience me dit qu'il me manque quelque chose d'évident ici.Quelle est la raison string.Join doit prendre un tableau au lieu d'un IEnumerable?
Répondre
Mise à niveau vers .NET 4.0 et utilisez le overload qui accepte un IEnumerable<string>
. Sinon, il suffit d'accepter que c'était un long problème en suspens qui n'a pas été résolu avant .NET 4.0. Vous pouvez résoudre le problème en créant votre propre méthode d'extension!
public static class StringEnumerableExtensions {
public static string Join(this IEnumerable<string> strings, string separator) {
return String.Join(separator, strings.ToArray());
}
}
Utilisation:
IEnumerable<string> strings;
Console.WriteLine(strings.Join(", "));
Jason, merci beaucoup, la programmation est devenue tellement joyeuse! ':)' – sbi
BTW, j'ai effectivement écrit un 'Join
Ce n'est plus le cas. .NET 4 a ajouté some overloads pour le rendre plus facile à utiliser. En particulier, non seulement vous n'avez pas besoin de passer dans un tableau - ce n'est pas non plus une séquence de chaînes. String.Join(String, IEnumerable<T>)
appellera ToString
sur chaque élément de la séquence.
Si vous n'utilisez pas .NET 4 mais que vous effectuez de nombreuses opérations d'assemblage de chaînes, vous pouvez toujours écrire vos propres méthodes, bien sûr.
Etes-vous en train de me dire qu'il n'y a pas de raison .NET <4 cela? – sbi
@sbi: Yup. C'est juste quelque chose que MS n'aurait vraisemblablement pas réalisé serait aussi utile aux développeurs. Il n'a pas besoin de nouvelles fonctionnalités de .NET 4, autant que je sache. –
Et ici, je m'attendais à un traitement long et éducatif sur les raisons pour lesquelles cela doit être un tableau ... – sbi
Overloads of Join
that take an IEnumerable<T>
argumentOverloads of Join
that take an IEnumerable<T>
argument ont été introduites dans .NET 4 - si vous n'utilisez pas .NET 4, je crains que vous ne soyez bloqué par le passage d'un tableau ou l'écriture de votre propre implémentation.
Je devine que la raison est simplement que cela n'a pas été jugé assez important quand le cadre a été conçu pour la première fois. IEnumerable<T>
est devenu beaucoup plus important avec l'introduction de LINQ.
(Bien sûr, il n'y avait pas de types génériques dans .NET lors de sa conception, mais il n'y a aucune raison pour qu'ils ne l'aient pas fait avec IEnumerable
non-générique s'ils l'avaient trouvé utile.)
et il n'y a aucune raison pour laquelle vous ne pouvez pas rouler votre propre version de Join
qui prend un IEnumerable<T>
si vous sentez que vous avez besoin et vous ne parvenez pas à passer à 4. .NET
... à moins que l'on écrit un * array-to-'IEnumerable
Je suppose que String.Join exige la capacité de parcourir le tableau deux fois (une fois pour mesurer la longueur, et une fois à faire la copie). Certaines classes implémentant iEnumerable peuvent être jointes avec succès dans un tableau de chaînes en effectuant une passe pour compter la longueur, en appelant Reset sur l'énumérateur et en utilisant une seconde passe pour copier les données, mais iEnumerable ne prend en charge ni une propriété Capabilities, ni une famille des classes dérivées comme iMultiPassEnumerable, les seules façons pour String.Join d'accepter en toute sécurité un iEnumerable serait soit (1) d'énumérer un type de liste et d'exécuter la jointure dessus, (2) de deviner la taille de la chaîne cible, et de réallouer comme ou (3) combiner les approches, en regroupant les chaînes courtes en groupes de jusqu'à 8K, puis en combinant tous les clusters en un résultat final (qui serait un mélange de clusters pré-concaténés et de longues chaînes du tableau original). Bien que j'assurerais certainement qu'il serait utile pour String.Join d'inclure un overhead qui convertit un iEnumerable en List, je ne vois pas que cela fournirait plus d'efficacité que de faire une telle conversion manuellement (contrairement au version tableau de String.Join, ce qui est plus efficace que de joindre manuellement des chaînes individuellement).
- 1. Quelle est la raison d'utiliser AMQP au lieu de Beanstalkd?
- 2. Quelle est la raison d'utiliser observer_field au lieu de onkeydown dans les rails?
- 3. Quelle est la raison de l'utilisation; dans les listes F # au lieu de,?
- 4. Quelle est la raison de conception pour utiliser une zone de groupe au lieu d'un panneau dans un formulaire Windows?
- 5. Un analogue de String.Join (string, string []) pour IEnumerable <T>
- 6. Quelle est la raison d'avoir '//' en Python?
- 7. Quelle est la meilleure façon de localiser un IEnumerable?
- 8. Quelle est la raison de l'utilisation du type Object au lieu d'un type réel pour les événements?
- 9. Quelle est la meilleure raison pour faire un tableau de scores élevé local dans mon application?
- 10. Prendre en variable, au lieu du chemin de fichier direct?
- 11. Une raison d'utiliser un assertion d'exécution au lieu de s'affirmer à la compilation?
- 12. Quelle est la différence entre IEnumerator et IEnumerable?
- 13. Pourquoi est ce defaultIfEmpty choisissant ienumerable <char> au lieu de chaîne?
- 14. Quelle est la raison de cette erreur de formatage Perl?
- 15. Quelle est la raison pour laquelle les cookies réapparaissent mystérieusement?
- 16. Quelle est la véritable raison d'utiliser ASP.NET Mobile?
- 17. Pourquoi jQuery s'appelle jQuery? Quelle est la raison du nom?
- 18. Quelle est la raison derrière GridView dans ASP.NET?
- 19. Quelle est la meilleure façon d'hériter un tableau qui doit stocker des données spécifiques à une sous-classe?
- 20. Quelle est la raison d'une exception win32 non gérée dans un programme d'installation?
- 21. Quelle approche DAL prendre?
- 22. Quelle est la syntaxe pour un type de tableau?
- 23. Quelle est la meilleure façon d'effacer un tableau de chaînes?
- 24. MVC2 Quelle est la meilleure façon de page, un tableau
- 25. Quelle est la déclaration WSDL pour un tableau d'entiers?
- 26. Quand, le cas échéant, IEnumerable doit-il être utilisé sur IEnumerable <T>?
- 27. Comment convertir un IEnumerable <IEnumerable <T>> en IEnumerable <T>
- 28. Quelle est la manière la plus élégante de réorganiser un tableau associatif?
- 29. Formulaire de contact PHP: puis-je prendre la valeur d'un span au lieu d'une entrée?
- 30. Comment convertir IEnumerable <char> en string [] afin que je puisse l'utiliser avec String.Join?
Vous serez heureux de savoir qu'il accepte 'IEnumerable'.NET 4 –
Ma conjecture serait qu'elle a été ajoutée avant IEnumerable. – asawyer
string.Join était ici bien avant Linq. Comment ça vous dérange? Il ne reste plus que quelques caractères à écrire. –