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.