3 votes

Linq Reverse -Laisse-t-il la variable modifiée ou fait-il une copie ?

J'ai un dicionnaire de cordes et de dates

private readonly Dictionary<string, DateTime>

comme variable membre privée dans une classe

J'ai des méthodes qui récupèrent récursivement la valeur suivante et précédente dans le dictionnaire en fonction d'une clé particulière.

Par exemple Il prend la clé donnée, fait une recherche dans la base de données, si elle est nulle, il prend la suivante et ainsi de suite de manière récursive. Il fait cela à la fois en avant et en arrière

J'ai utilisé ceci pour obtenir le prochain Trouver le prochain enregistrement dans une série : LINQ

Ma question est la suivante : puis-je simplement ajouter Reverse à l'instruction linq pour faire cela à l'envers ?

Il est évident que cela fonctionnera mais je m'inquiète de l'état dans lequel cela laissera ma liste de variables membres.

Est-ce qu'il sera inversé ? ou est-ce qu'une copie sera faite lors de l'inversion ?

merci

7voto

Jason Points 125291

Enumerable.Reverse ne modifie pas la séquence sur laquelle il est invoqué.

3voto

hypehuman Points 225

Comme d'autres l'ont dit, Enumerable.Reverse ne modifiera pas la séquence sous-jacente (sauf dans le cas rare où l'énumération sur la séquence la modifiera).

Toutefois, si vous utilisez une liste, vous risquez d'appeler List.Reverse, qui modifie effectivement la liste.

List<int> list = /* initialize */;
IEnumerable<int> asEnumerable = list;

// these call List<int>.Reverse(), which changes the list
list.Reverse();
((List<int>)asEnumerable).Reverse();

// these call Enumerable.Reverse<int>(), which does not change the list, but returns a new IEnumerable<int>
asEnumerable.Reverse();
((IEnumerable<int>)list).Reverse();
((IList<int>)list).Reverse();

Désolé, j'aurais fait un commentaire sur l'une des autres bonnes réponses, mais je voulais inclure le code.

1voto

KeithS Points 36130

Aucune des méthodes Linq, y compris Reverse, ne modifiera l'énumérable qui leur est transmis, À MOINS QUE l'énumération de l'énumérable n'entraîne des modifications (vous le sauriez si c'était le cas ; peu de types énumérables intégrés, voire aucun, ont des effets secondaires sur l'accès aux données).

Ce que la méthode reverse DOIT faire, puisqu'elle nécessite la connaissance de la cardinalité de la collection, est de placer les éléments de l'énumérable dans un tableau qu'elle va itérer en sens inverse. Un grand nombre de méthodes Linq d'énumérables souvent utilisées, telles que OrderBy, font cela en coulisse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X