Voici le code de La réponse de Marc Gravell ainsi qu'un exemple de son 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 ce code peut parfois poser des problèmes, car IsAny()
commence à parcourir la séquence. Je soupçonne que ce qui Réponse de Robert Harvey voulait dire que vous n'avez souvent pas besoin de vérifier pour null
et vide. Souvent, vous pouvez simplement vérifier s'il y a null et ensuite utiliser foreach
.
Pour éviter de démarrer la séquence deux fois et profiter de l'avantage de foreach
Je viens d'écrire 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 permet d'économiser quelques lignes de saisie, mais ce code me semble plus clair. Je soupçonne que certains développeurs ne réaliseraient pas immédiatement que IsAny(items)
va commencer à parcourir la séquence. (Bien sûr, si vous utilisez beaucoup de séquences, vous apprenez rapidement à réfléchir à ce qui les traverse).
1 votes
@msarchet : Je te donnerais probablement la réponse si ce n'était pas le commentaire :).
1 votes
Pour moi, cela ressemble à un problème XY. au lieu de demander "comment puis-je vérifier la nullité exactement partout sans que cela soit si gênant", vous devriez vous demander "comment puis-je améliorer ma conception pour ne pas avoir à vérifier la nullité partout" ?
0 votes
Vous pouvez utiliser la ligne suivante à la place : myCollection ?.FirstOrDefault() == null