正直なところ、Funcs と Actions を使い始めると状況に応じて変わることがあります。次の 3 つの関数を使用しているとします。
Func<DataClasses.User, String> userName = user => user.UserName;
Func<DataClasses.User, Boolean> userIDOverTen = user => user.UserID < 10;
Func<DataClasses.User, Boolean> userIDUnderTen = user => user.UserID > 10;
ご覧のように、最初のものはユーザー名を取得するためにラムバ式を置き換え、2 つ目は ID が 10 より小さいかどうかをチェックするために使用されるラムバ式を置き換えます。
注: これはばかげた例ですが、機能します。
var userList =
from user in userList
where userIDOverTen(user)
select userName;
対
var otherList =
userList
.Where(IDIsBelowNumber)
.Select(userName)
この例では、拡張メソッドが Func をフルに活用できるため、2 番目の式は少し冗長ですが、Linq 式は boolean を返す Func ではなく Boolean を探すだけなので、それはできません。ただし、これは式言語を使用した方がよい場合があります。単なるユーザー以上のものを受け取るメソッドがすでにあるとします。
private Boolean IDIsBelowNumber(DataClasses.User user,
Int32 someNumber, Boolean doSomething)
{
return user.UserID < someNumber;
}
注: doSomething は、where 拡張メソッドがユーザーと整数を取り、ブール値を返すメソッドで問題ないため、そこにあります。この例ではちょっと面倒です。
Linq クエリを見ると、次のようになります。
var completeList =
from user in userList
where IDIsBelowNumber(user, 10, true)
select userName;
あなたはそれでいいです。拡張メソッド:
var otherList =
userList
.Where(IDIsBelowNumber????)
.Select(userName)
ラムダ式がなければ、本当にそのメソッドを呼び出すことはできません。そこで、元のメソッド呼び出しに基づいて Func を作成するメソッドを作成する必要があります。
private Func<DataClasses.User, Boolean> IDIsBelowNumberFunc(Int32 number)
{
return user => IDIsBelowNumber(user, number, true);
}
そして、それを接続します:
var otherList =
userList
.Where(IDIsBelowNumberFunc(10))
.Select(userName)
ご覧のとおり、クエリ アプローチを使用する方が簡単な場合もあります。