57 votes

Dans LINQ, sélectionnez toutes les valeurs de la propriété X où X != null

Existe-t-il un moyen plus court d'écrire ce qui suit ? (Quelque chose qui vérifierait null sans écrire explicitement != null )

 from item in list 
where item.MyProperty != null 
select item.MyProperty

78voto

R. Martinho Fernandes Points 96873

Vous pouvez utiliser l' opérateur OfType . Il ignore les valeurs nulles dans la séquence source. Utilisez simplement le même type que MyProperty et il ne filtrera rien d'autre.

 // given:
// public T MyProperty { get; }
var nonNullItems = list.Select(x => x.MyProperty).OfType<T>();

Je déconseille cela cependant. Si vous souhaitez choisir des valeurs non nulles, quoi de plus explicite que de dire que vous voulez « les MyProperties de la liste qui ne sont pas nulles » ?

15voto

Anthony Points 2461

J'ai tendance à créer une classe statique contenant des fonctions de base pour des cas comme ceux-ci. Ils me permettent d'écrire des expressions comme

 var myValues myItems.Select(x => x.Value).Where(Predicates.IsNotNull);

Et la collection de fonctions de prédicat :

 public static class Predicates
{
    public static bool IsNull<T>(T value) where T : class
    {
        return value == null;
    }

    public static bool IsNotNull<T>(T value) where T : class
    {
        return value != null;
    }

    public static bool IsNull<T>(T? nullableValue) where T : struct
    {
        return !nullableValue.HasValue;
    }

    public static bool IsNotNull<T>(T? nullableValue) where T : struct
    {
        return nullableValue.HasValue;
    }

    public static bool HasValue<T>(T? nullableValue) where T : struct
    {
        return nullableValue.HasValue;
    }

    public static bool HasNoValue<T>(T? nullableValue) where T : struct
    {
        return !nullableValue.HasValue;
    }
}

4voto

abatishchev Points 42425

Il n'y a aucun moyen d'ignorer une vérification si elle existe.

3voto

Vlad Bezden Points 5024

// si vous devez vérifier si la MyProperty de tous les éléments n'a pas de valeur null

 if (list.All(x => x.MyProperty != null))
// do something

// ou si vous devez vérifier si au moins la propriété d'un élément n'a pas de valeur null

 if (list.Any(x => x.MyProperty != null))
// do something

Mais vous devez toujours vérifier null

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X