Добавить в коллекцию, если не Null
У меня есть очень большой объект со многими переменными типа NULL. У меня также есть словарь, который я хочу заполнить этим объектом непустыми переменными.
Код будет выглядеть примерно так:
if (myObject.whatever != null)
{
myDictionary.Add("...",myObject.whatever);
}
if (myObject.somethingElse != null)
{
myDictionary.Add("...",myObject.somethingElse);
...
EDIT (Извините, перепутал код)
Когда мы повторяем это, в наш раз мы получаем беспорядок очень длинного кода. Есть ли более короткий способ написать этот беспорядок? Я знаю об Условном Операторе (ака?), Но это только для назначений. Есть ли что-то подобное для добавления в коллекцию?
Ответы
Ответ 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
Если это не проблема производительности: почему бы не добавить все, а затем удалить то, что вам не нужно?