Подтвердить что ты не робот

Добавить в коллекцию, если не Null

У меня есть очень большой объект со многими переменными типа NULL. У меня также есть словарь, который я хочу заполнить этим объектом непустыми переменными.

Код будет выглядеть примерно так:

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

...

EDIT (Извините, перепутал код)

Когда мы повторяем это, в наш раз мы получаем беспорядок очень длинного кода. Есть ли более короткий способ написать этот беспорядок? Я знаю об Условном Операторе (ака?), Но это только для назначений. Есть ли что-то подобное для добавления в коллекцию?

4b9b3361

Ответ 1

Как насчет метода расширения для вашего словаря?

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); }
}

Затем вы можете сделать следующее:

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

Ответ 2

Я бы рекомендовал написать метод расширения:

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);
    }
}

Использование (object)value != null гарантирует, что это работает так, как вы ожидали бы с типами с нулевым типом (например, int?)) (например, int) и ссылочными типами (например, SomeClass). Если вы сравните его с default(TValue), то int из 0 не будет добавлен, хотя он не является нулевым. Если вы включаете требование TValue : class, вы не можете использовать Nullable<T> в качестве типа, который, по вашему мнению, является наиболее распространенным.

Ответ 3

Вы можете создать метод, который скрывает ваш 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);
    }
}

Вы можете заработать "очки за стиль", сделав метод расширением (вам нужно добавить его в статический класс):

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);

Если вы знаете, что вы вставляете только объекты ссылочного типа, замените default(T) на null и добавьте ограничение class T к общему.

Ответ 4

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

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

и т.д.

Ответ 5

Если это не проблема производительности: почему бы не добавить все, а затем удалить то, что вам не нужно?