c# resharper ienumerable

c# - Incluso las comprobaciones de "IsNullOrEmpty" dan advertencias de "Posible enumeración múltiple de IEnumerable"



resharper (2)

Como @tdammers identifica, las "enumeraciones múltiples" a las que se hace referencia son las dos enumeraciones requeridas por Any y All . Ya que quieres rechazar una secuencia vacía, lo mejor que puedo hacer es:

public static bool SomeMethod(IEnumerable<string> enumerable) { if (enumerable == null) throw new ArgumentNullException(); // Manually perform an All, keeping track of if there are any elements bool anyElements = false; bool result = true; foreach (string item in enumerable) { anyElements = true; result = result && SomeBooleanMethod(item); // Can short-circuit here if (!result) break; } if (!anyElements) throw new ArgumentException(); // Empty sequence is invalid argument return result; }

Ya hay una pregunta en SO sobre "posibles enumeraciones múltiples" , pero esta pregunta es más específica.

Considere el siguiente método, que toma una IEnumerable<string> como entrada y ejecuta un método dado contra cada uno de sus elementos:

public static bool SomeMethod(IEnumerable<string> enumerable) { if (enumerable.IsNullOrEmpty()) { // throw exception. } else { return (enumerable.All(SomeBooleanMethod)); } }

En el código anterior, IsNullOrEmpty es solo un método de extensión que se ejecuta

return (!ReferenceEquals(enumerable, null) || enumerable.Any());

El problema es que ReSharper me advierte acerca de "Posibles enumeraciones múltiples de IEnumerable", y realmente no sé si esto realmente puede ser un problema o no.

Entiendo el significado de la advertencia, pero ¿qué podría hacer realmente en esta situación si realmente necesita verificar y lanzar una excepción en caso de nulidad o vacío?


Significa que estás iterando (parcialmente) sobre IEnumerable más de una vez: primero en tu llamada a Any() (que necesita al menos inicializar una iteración para ver si el enumerable devuelve algún elemento), y una segunda vez en All ( que se repite desde el principio).

La razón por la que ReSharper le advierte acerca de esto es que la enumeración sobre un número enumerable puede causar efectos secundarios, y una iteración involuntaria dos veces puede desencadenar los efectos secundarios dos veces, lo que puede o no ser deseable.