如果不是空,则添加到集合

时间:2012-07-26 12:08:44

标签: c# nullable

我有一个非常大的对象,有许多可空类型的变量。我还有一本字典,我想填写这个对象的非空变量。

代码看起来像这样

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

...

编辑(对不起搞砸代码)

当我们无数次重复这个时,我们会得到一堆很长的代码。有没有更短的方式我可以写这个烂摊子?我知道条件运算符(又名?)但这只是为了分配。是否有类似的内容可以添加到集合中?

5 个答案:

答案 0 :(得分:36)

你字典的扩展方法怎么样?

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

答案 1 :(得分:6)

我建议编写扩展方法:

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)和引用类型(例如{{} 1}})。如果将其与SomeClass进行比较,则default(TValue)的{​​{1}}将不会被添加,即使它不为空。如果您要求int要求,则不能使用0作为类型,这听起来是您最常见的用法。

答案 2 :(得分:2)

您可以制作隐藏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约束。

答案 3 :(得分:0)

如果这不是性能问题:为什么不添加所有内容然后删除不需要的内容?

答案 4 :(得分:0)

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

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