Voici le code de la réponse de Marc Gravell , avec un exemple d'utilisation.
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.");
}
}
}
Comme il le dit, toutes les séquences ne sont pas répétables, de sorte que le code peut parfois causer des problèmes, car IsAny()
commence à parcourir la séquence. Je soupçonne que la réponse de Robert Harvey voulait dire que vous n'avez souvent pas besoin de vérifier null
et de vider. Souvent, vous pouvez simplement vérifier la valeur null, puis utiliserforeach
.
Pour éviter de démarrer la séquence deux fois et en profiter foreach
, j'ai juste écrit un code comme celui-ci:
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.");
}
}
}
Je suppose que la méthode d'extension vous évite quelques lignes de frappe, mais ce code me semble plus clair. Je soupçonne que certains développeurs ne se rendraient pas immédiatement compte que IsAny(items)
cela commencerait réellement à parcourir la séquence. (Bien sûr, si vous utilisez beaucoup de séquences, vous apprenez rapidement à réfléchir à leurs étapes.)