ジェネリックリストをループして、いくつかの条件に基づいてメソッドを呼び出すにはどうすればよいですか?linq構文を使用したいのですが。もちろん、以下は機能しません。何か案は?
somelist.ForEach(i => i.DeptType == 1 && i != null () {MyMethod(someInt)});
それが不可能な場合、簡潔な構文を使用した次善の方法は何ですか?
Whereを使用して、選択するレコードを指定し、ForEachを使用してメソッドを実行してみてください。
somelist.Where(i => i.DeptType == 1 && i != null)
.ToList()
.ForEach( i=> MyMethod(i.someInt));
//standard style ... since Linq is Functional/side-effects-free
foreach(var x in somelist.Where(i => i != null && i.DeptType == 1))
{
SomeMethod(x);
}
//anon method style ... for those that must use ForEach
somelist.ForEach(i => {if (i != null && i.DeptType == 1) {MyMethod(someInt);}});
ワンライナー LINQ クエリは魅力的かもしれませんが、通常、副作用のない操作 (クエリ プロジェクション、フィルタリングなど) に関連付けられています。あなたの場合、従来のforeach
ループを使用したほうがよい場合があります。
foreach (var i in somelist)
if (i != null && i.DeptType == 1)
MyMethod(someInt);
PS あなたの元の状態、i.DeptType == 1 && i != null
は間違って注文されました。コードは、 null チェックの前に実行されるNullReferenceException
ため、引き続き発生します。i.DeptType
i
私は使用します:
somelist.Where(q => q !=null)
.Where(q => q.DeptType == 1)
.Select(q => MyMethod(q));
結果のコレクションには、処理された元の値/メソッド呼び出しの戻り値のリストが含まれます。
次のように、オブジェクトのフィールドにアクセスする前に必ず null チェックを行う必要があります。
somelist.Where(i => i != null && i.DeptType == 1).ToList().ForEach( i=> MyMethod(i.someInt));
上記の誰かが指摘したように、Where() 呼び出しから返された汎用 IEnumerable オブジェクトで ForEach() を呼び出すことはできません。結果を汎用リストに保存するには、最初に ToList() を呼び出す必要があります。上記のコードを更新して、その変更を含めました。