2008-09-30 8 views
1

J'ai posté une réponse à this question, y compris une très courte diatribe à la fin sur la façon dont String.Split() doit accepter IEnumerable < chaîne> plutôt que chaîne [].Hérite IEnumerable à partir de conséquences d'objet

Cela m'a fait réfléchir. Que faire si la classe Object de base dont tout le reste hérite fournit une implémentation par défaut pour IEnumerable, de sorte que tout retourne maintenant un énumérateur sur un seul élément (lui-même) - à moins qu'il ne soit remplacé par d'autres classes. L'idée est que si des méthodes comme String.Split() acceptaient IEnumerable plutôt qu'un tableau, je pourrais passer une seule chaîne à la fonction et cela fonctionnerait plutôt que de créer un tableau de séparateurs . Je suis sûr qu'il y a toutes sortes de raisons pour ne pas le faire, pas la moindre est que si tout implémente IEnumerable, alors les quelques classes où l'implémentation s'éloigne de la valeur par défaut pourraient se comporter différemment de ce que vous attendez dans certains scénarios. Mais je pensais toujours que ce serait un exercice amusant: quelles autres conséquences y aurait-il?

+0

Je me demande si je devrais partager mes réponses ... – MagicKat

Répondre

0

l'opérateur d'index ([]) ne fait pas partie du contrat de IEnumerable <T> Après avoir regardé le code dans le réflecteur, le code utilise l'opérateur d'index fortement, ce qui fait toujours partie de tableau.

Eh bien, simplement, Array aura toujours un énumérateur.

L'idée est que si les méthodes alors comme String.Split() acceptaient IEnumerable plutôt qu'un tableau que je pouvais passer une seule chaîne à la fonction et il serait tout simplement travailler, plutôt que d'avoir à beaucoup sur la création d'un tableau séparateur.

Ce n'est pas vrai, chaîne hérite IEnumerable <ombles> Et vous n'avez pas la variance générique, de sorte que vous ne pouvez pas lancer IEnumerable <omble> à chaîne IEnumerable < >. Vous obtiendrez le IEnumerable <char> version (s) de split, plutôt que la chaîne requise.

+0

Cependant, je préférerais que string.join accepté IEnumerable plutôt que string [] tel qu'il est maintenant. –

+0

Il s'agit d'un détail d'implémentation. Si IEnumerable supporte l'opérateur d'index (ce qui n'est pas le cas), je suis sûr qu'il sera utilisé. – MagicKat

+0

@Jeff Yates: Malheureusement, IEnumerable ne garantit pas vraiment que des itérations multiples produiront des données identiques. Pour que String.Join fonctionne, il doit faire un passage dans la liste pour déterminer la longueur totale de toutes les chaînes, puis un second passage pour les joindre ensemble. Si les deux passages à travers le IEnumerable devaient renvoyer différentes longueurs de chaînes, cela pourrait entraîner une opération «join». – supercat

0

Avez-vous pensé à utiliser un objet d'assistance et à implémenter un Split pour la classe IEnumerable?

J'ai fait une fois GetDescription pour la classe Enum afin d'obtenir le DescriptionAttribute facilement. Cela fonctionne incroyablement bien.

2
public static IEnumerable<object> ToEnumerable(this object someObject) 
{ 
    return System.Linq.Enumerable.Repeat(someObject, 1); 
} 
Questions connexes