独自のセマンティクスについては、信頼できる答えが既にあります。しかし、私にとって、メソッドの命名は、考えれば考えるほどわかりにくくなります。AddIf
ある場合は追加するか、すべての場合は追加することを意味しますか? あなたの場合、それがすべてです。したがって、より適切な名前を付ける必要があります。AddIfAll
か何か。
何かが存在しない場合にリストに追加することは一般的な要件であり、私が提案するのは、呼び出し側から簡単にする目的のためにもう少し肉付けされたものです(私は信じています)。
多分
public static bool AddIfNotContains<S, T>(this ICollection<S> lstObject,
Func<S, T> selector, T valueToMatch,
S objectToAdd)
{
if (lstObject.Contains(selector, valueToMatch))
return false;
lstObject.Add(objectToAdd);
return true;
}
Contains
プログラムで使用することを好む小さなオーバーロード:
public static bool Contains<S, T>(this IEnumerable<S> lstObject,
Func<S, T> comparer, T valueToMatch)
{
return lstObject.Any(s => comparer(s).Equals(valueToMatch));
}
Equals
これにより、毎回オペレーターを作成する手間が省けます。
あなたは呼び出すことができます:
persons.AddIfNotContains(s => s.Name, "John", new Person { ... });
これにより、構文がはるかに簡単になると思います。
ノート:
ここで問題を認識していただければ幸いです。とても上手に書けます
persons.AddIfNotContains(s => s.Name, "John", new Person { Name = "Serena", .. });
Serena
ここでは をチェックしているため、その名前の誰かがすでに存在する場合でもJohn
。それがあなたにとって大丈夫なら、まあまあです。あなたの問題を正しく理解していれば、より良い実装は次のようになります。
public static bool AddIfTrulyNotContains<S, T>(this ICollection<S> lstObject,
Func<S, T> selector, S objectToAdd)
{
if (lstObject.Contains(selector, selector(objectToAdd)))
return false;
lstObject.Add(objectToAdd);
return true;
}
これで簡単に呼び出すことができます:
persons.AddIfTrulyNotContains(s => s.Name, new Person { Name = "John", .. });
これは、リストにない場合にチェックしJohn
て追加するだけです。さらに、加算を表すJohn
戻り値の型を にしました。bool