2011-05-20 1 views
21

Je suis à la recherche d'un moyen facile de cloner un paramètre IEnumerable<T> pour référence ultérieure. La méthode d'extension ToArray de LINQ semble être une façon agréable et concise de le faire.Puis-je me fier au LINQ ToArray() retournant toujours une nouvelle instance?

Cependant, je ne sais pas s'il est toujours garanti de retourner une nouvelle instance de tableau. Plusieurs des méthodes LINQ vérifieront le type réel de l'énumérable, et le raccourci si possible; Par exemple, Count() verra si la méthode implémente ICollection<T>, et si oui, lira directement sa propriété Count; il ne fait qu'itérer la collection s'il le faut.

Étant donné cet état d'esprit de court-circuit lorsque cela est possible, il semble que, si je l'appelle ToArray() sur quelque chose qui est déjà un tableau, ToArray() pourrait court-circuit et retourner simplement la même instance de tableau. Cela répondrait techniquement aux exigences d'une méthode ToArray. A partir d'un test rapide, il apparaît que, dans .NET 4.0, l'appel ToArray() sur un tableau renvoie une nouvelle instance. Ma question est: puis-je m'en remettre? Puis-je avoir la certitude que ToArray retournera toujours une nouvelle instance, même dans Silverlight et dans les futures versions de .NET Framework? Y a-t-il de la documentation quelque part qui soit claire sur ce point?

Répondre

25

Oui, ToArray va toujours retourner un nouveau tableau - le faire changer pour retourner une valeur existante serait un changement horriblement brisant, et je suis absolument convaincu que l'équipe .NET ne le ferait pas. C'est une chose importante sur laquelle s'appuyer. Il est dommage qu'il est pas documenté :(

Il y a beaucoup de subtiles morceaux de comportement dans LINQ aux objets qui ne sont probablement pas la peine compter sur, mais dans ce cas il est un massif peu du comportement, je serait absolument étonné qu'il change.

court-circuit est grand quand il ne modifie pas le comportement, mais généralement à des objets est LINQ assez bien dans l'optimisation que dans les cas valides. Vous pouvez regarder le twoposts dans ma série Edulinq couvrant l'optimisation

15

Puisque cette méthode ToArray est interne au framework .NET, je ne mettrais pas ma vie sur MS ne la changeant jamais. Cependant, ce que je ferais, est d'ajouter un test d'unité affirmant que ToArray retourne une nouvelle instance de tableau. De cette façon, si vous changez plus tard les versions du framework .NET, vous saurez automatiquement si la fonctionnalité change.

+0

+1 pour l'idée de test unitaire. – NerdFury

Questions connexes