32

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

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

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

...

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

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

4

4 に答える 4

51

辞書の拡張メソッドはどうですか?

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);
于 2012-07-26T12:11:47.563 に答える
7

拡張メソッドを作成することをお勧めします。

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

を使用すると、null 許容型 ( など) 値型 ( など) および参照型 ( など)(object)value != nullで期待どおりに動作することが保証されます。と比較すると、 null ではありませんが、ofは追加されません。要件を含めると、最も一般的な使用法のように聞こえるタイプとして使用できません。int?intSomeClassdefault(TValue)int0TValue : classNullable<T>

于 2012-07-26T12:16:55.167 に答える
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

于 2012-07-26T12:11:19.587 に答える
0
public void addToDict(string ?myObj, Dictionary<,> myDict) {
        if (myObj != null)
              myDict.Add("...", myObj);
}

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

于 2012-07-26T12:12:04.487 に答える