7
votes

Vérifiez si la propriété est NULL dans l'expression de Lambda

J'ai une liste d'objets que j'essaie de lier à la liste de liste. Je trie par deux propriétés. Le problème existe que certains enregistrements peuvent ne pas avoir l'une des propriétés. Cela provoque une erreur. J'aimerais qu'il lie toujours les enregistrements qui ont la propriété.

IEnumerable<ERec> list = retailerList.Cast<ERec>();
lvwRetailStores.DataSource = list.OrderByDescending(r => r.Properties["RS_Partner Type"].ToString())
                                 .ThenBy(r => r.Properties["RS_Title"].ToString());


1 commentaires

Voulez-vous des enregistrements manquant la propriété pour être au début ou à la fin de la liste triée?


4 Réponses :


9
votes
list.Where(r => r.Properties["RS_Partner_Type"] != null && r.Properties["RS_Title"] != null)
    .OrderByDescending(r => r.Properties["RS_Partner Type"].ToString())
    .ThenBy(r => r.Properties["RS_Title"].ToString());
Or instead of != null, use whatever test the Properties collection has.

0 commentaires

0
votes

Vous pouvez utiliser une expression ternaire dans la Lambda: xxx


1 commentaires

Je dois noter, une fois que les Lambdas commencent à obtenir ce long, c'est une bonne idée de toute façon de les déclarer comme des fonctions pour nettoyer le code.



0
votes

Une autre approche commune consiste à donner à la collection une valeur par défaut appropriée et à renvoyer que lorsque la collection n'a pas de clé particulière. Par exemple, si Propriétés code> implémente le cahicotement,

public static class IDictionaryExtension {
    public static TValue GetValue<TKey, TValue>(this IDictionary<TKey, TValue> dict, TKey key, TValue default) {
        TValue result;
        return dict.TryGetValue(key, out result) ? result : dflt;
    }
}
...
lvwRetailStores.DataSource = list.OrderByDescending(r => r.GetValue("RS_Partner Type", "").ToString())
                                 .ThenBy(r => r.GetValue("RS_Title","").ToString());


0 commentaires

1
votes

J'ai trouvé que le ?? L'opérateur fonctionne bien. J'utilise des parenthèses pour évaluer pour NULL,

Par exemple:

datetime? Aujourd'hui = DateTimevalue // Vérifiez NULL, si NULL a mis la date d'aujourd'hui DateTime Gooddate = aujourd'hui ?? DateTime.now

Cette même logique fonctionne à Lambda, utilisez simplement des parenthèses pour vous assurer que les comparaisons correctes sont utilisées.


0 commentaires