web-dev-qa-db-ja.com

nullでない場合はコレクションに追加

多くのnull許容型の変数を持つ非常に大きなオブジェクトがあります。このオブジェクトのnull以外の変数で埋めたい辞書もあります。

コードは次のようになります

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

...

編集(申し訳ありませんがコードを台無しにしました)

これを何度か繰り返すと、非常に長いコードの混乱が発生します。この混乱を書くことができる短い方法はありますか?条件演算子(別名?)については知っていますが、それは割り当てのためだけのものです。コレクションに追加するようなものはありますか?

27
Aabela

辞書の拡張方法はどうですか?

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

拡張メソッドを書くことをお勧めします:

_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>_を使用することはできません。これは、最も一般的な使用法のようです。

6
Tim S.

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_制約を追加します。

2
dasblinkenlight

パフォーマンスの問題ではない場合:すべてを追加してから、不要なものを削除しないでください。

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

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

0
Shai