Aquí está el código de la respuesta de Marc Gravell , junto con un ejemplo de uso.
using System;
using System.Collections.Generic;
using System.Linq;
public static class Utils
{
public static bool IsAny<T>(this IEnumerable<T> data)
{
return data != null && data.Any();
}
}
class Program
{
static void Main(string[] args)
{
IEnumerable<string> items;
//items = null;
//items = new String[0];
items = new String[] { "foo", "bar", "baz" };
/*** Example Starts Here ***/
if (items.IsAny())
{
foreach (var item in items)
{
Console.WriteLine(item);
}
}
else
{
Console.WriteLine("No items.");
}
}
}
Como él dice, no todas las secuencias son repetibles, por lo que el código a veces puede causar problemas, porque IsAny()
comienza a recorrer la secuencia. Sospecho que la respuesta de Robert Harvey fue que a menudo no es necesario verificar null
y vaciar. A menudo, puede verificar si es nulo y luego usarlo foreach
.
Para evitar comenzar la secuencia dos veces y aprovechar foreach
, acabo de escribir un código como este:
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main(string[] args)
{
IEnumerable<string> items;
//items = null;
//items = new String[0];
items = new String[] { "foo", "bar", "baz" };
/*** Example Starts Here ***/
bool isEmpty = true;
if (items != null)
{
foreach (var item in items)
{
isEmpty = false;
Console.WriteLine(item);
}
}
if (isEmpty)
{
Console.WriteLine("No items.");
}
}
}
Supongo que el método de extensión le ahorra un par de líneas de escritura, pero este código me parece más claro. Sospecho que algunos desarrolladores no se darían cuenta de inmediato de que IsAny(items)
realmente comenzarán a recorrer la secuencia. (Por supuesto, si está utilizando muchas secuencias, aprende rápidamente a pensar qué pasos debe seguir).