web-dev-qa-db-fra.com

Ajouter à la collection si non nul

J'ai un très grand objet avec de nombreuses variables de type nullable. J'ai également un dictionnaire que je veux remplir avec les variables non nulles de cet objet.

Le code ressemblera à ceci

if (myObject.whatever != null)
{
myDictionary.Add("...",myObject.whatever);
}
if (myObject.somethingElse != null)
{
myDictionary.Add("...",myObject.somethingElse);

...

EDIT (Désolé d'avoir foiré le code)

Lorsque nous répétons cela pour la énième fois, nous obtenons un désordre de code très long. Existe-t-il un moyen plus court d'écrire ce gâchis? Je connais l'opérateur conditionnel (aka?) Mais c'est juste pour les affectations. Y a-t-il quelque chose comme ça pour ajouter à une collection?

27
Aabela

Que diriez-vous d'une méthode d'extension pour votre dictionnaire?

public static void AddIfNotNull<T,U>(this Dictionary<T,U> dic, T key, U value) 
where U : class {
    if (value != null) { dic.Add(key, value); }
}

Vous pouvez alors faire ceci:

myDictionary.AddIfNotNull("...",myObject.whatever);
38
Botz3000

Je recommanderais d'écrire une méthode d'extension:

public static class MyExtensions
{
    public static void AddIfNotNull<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, TValue value)
    {
        if ((object)value != null)
            dictionary.Add(key, value);
    }
}

L'utilisation de (object)value != null Garantit que cela fonctionne comme prévu avec les types nullables, (par exemple int?) Les types de valeur, (par exemple int) et les types de référence (par exemple SomeClass). Si vous le comparez à default(TValue), un int de 0 Ne sera pas ajouté, même s'il n'est pas nul. Si vous incluez une exigence TValue : class, Vous ne pouvez pas utiliser Nullable<T> Comme type, ce qui semble être votre utilisation la plus courante.

6
Tim S.

Vous pouvez créer une méthode qui cache votre if:

AddIfNotNull(myDictionary, "...", myObject.whatever);

private static void AddIfNotNull<K,T>(
    IDictionary<K,T> myDictionary
,   K key
,   T value) {
    if (value != default(T)) {
        myDictionary.Add(key, value);
    }
}

Vous pouvez gagner des "points pour le style" en faisant de la méthode une extension (vous devez alors l'ajouter à une classe statique):

private static void AddIfNotNull<K,T>(
    this IDictionary<K,T> myDictionary
,   K key
,   T value) {
    if (value != default(T)) {
        myDictionary.Add(key, value);
    }
}

myDictionary.AddIfNotNull(myDictionary, "...", myObject.whatever);

Si vous savez que vous n'insérez que des objets de type référence, remplacez default(T) par null et ajoutez une contrainte class T Au générique.

2
dasblinkenlight

Si ce n'est pas un problème de performances: pourquoi ne pas tout ajouter puis supprimer ce dont vous n'avez pas besoin?

0
Philipp
public void addToDict(string ?myObj, Dictionary<,> myDict) {
        if (myObj != null)
              myDict.Add("...", myObj);
}

addToDict(myObject.whatever, myDict);
addToDict(myObject.somethignElse, myDict);

etc

0
Shai