多くのnull許容型の変数を持つ非常に大きなオブジェクトがあります。このオブジェクトのnull以外の変数で埋めたい辞書もあります。
コードは次のようになります
if (myObject.whatever != null)
{
myDictionary.Add("...",myObject.whatever);
}
if (myObject.somethingElse != null)
{
myDictionary.Add("...",myObject.somethingElse);
...
編集(申し訳ありませんがコードを台無しにしました)
これを何度か繰り返すと、非常に長いコードの混乱が発生します。この混乱を書くことができる短い方法はありますか?条件演算子(別名?)については知っていますが、それは割り当てのためだけのものです。コレクションに追加するようなものはありますか?
辞書の拡張方法はどうですか?
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);
拡張メソッドを書くことをお勧めします:
_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
_を使用すると、null許容型(たとえば、_int?
_)の値型(たとえば、int
)および参照型(たとえば、SomeClass
)で期待どおりに機能します)。これをdefault(TValue)
と比較すると、nullでなくても_0
_のint
は追加されません。 _TValue : class
_要件を含める場合、タイプとして_Nullable<T>
_を使用することはできません。これは、最も一般的な使用法のようです。
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
_制約を追加します。
パフォーマンスの問題ではない場合:すべてを追加してから、不要なものを削除しないでください。
public void addToDict(string ?myObj, Dictionary<,> myDict) {
if (myObj != null)
myDict.Add("...", myObj);
}
addToDict(myObject.whatever, myDict);
addToDict(myObject.somethignElse, myDict);
等