我有一个非常大的对象,有许多可空类型的变量。我还有一本字典,我想填写这个对象的非空变量。
代码看起来像这样
if (myObject.whatever != null)
{
myDictionary.Add("...",myObject.whatever);
}
if (myObject.somethingElse != null)
{
myDictionary.Add("...",myObject.somethingElse);
...
编辑(对不起搞砸代码)
当我们无数次重复这个时,我们会得到一堆很长的代码。有没有更短的方式我可以写这个烂摊子?我知道条件运算符(又名?)但这只是为了分配。是否有类似的内容可以添加到集合中?
答案 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);
等