Honnêtement, parfois, il peut être de la situation une fois que vous commencez à utiliser Funcs et des Actions. Dites que vous êtes à l'aide de ces trois funcs:
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;
Comme vous pouvez le voir le premier remplace le lamdba expression pour obtenir le nom d'utilisateur, le second remplace un lamdba expression utilisée pour vérifier si l'ID est inférieur à 10, et avouons-le, la troisième devrait être assez facile à comprendre maintenant.
NOTE: Ceci est un exemple stupide, mais il fonctionne.
var userList =
from user in userList
where userIDOverTen(user)
select userName;
Rapport
var otherList =
userList
.Where(IDIsBelowNumber)
.Select(userName)
Dans cet exemple, le deuxième est un peu moins verbeux depuis la méthode d'extension permet l'utilisation de la touche Func, mais il Linq expression ne peut pas car il est pour un Booléen plutôt que d'une Fonction qui retourne un booléen. Cependant, c'est là où il pourrait être préférable d'utiliser l'expression de la langue. Dire que vous avez déjà eu une méthode qui prend plus que juste un utilisateur:
private Boolean IDIsBelowNumber(DataClasses.User user,
Int32 someNumber, Boolean doSomething)
{
return user.UserID < someNumber;
}
Remarque: doSomething est juste là, à cause de la méthode d'extension d'être ok avec une méthode qui prend un utilisateur et un entier et retourne un booléen. Type de gênant pour cet exemple.
Maintenant, si vous regardez la requête Linq:
var completeList =
from user in userList
where IDIsBelowNumber(user, 10, true)
select userName;
Vous êtes bon pour elle. Maintenant, la Méthode d'Extension:
var otherList =
userList
.Where(IDIsBelowNumber????)
.Select(userName)
Sans une expression lambda, j'ai vraiment ne peut pas appeler cette méthode. Alors maintenant, ce que j'ai à faire est de créer une méthode qui crée un Func basé sur l'original de l'appel de méthode.
private Func<DataClasses.User, Boolean> IDIsBelowNumberFunc(Int32 number)
{
return user => IDIsBelowNumber(user, number, true);
}
Et puis branchez-le à:
var otherList =
userList
.Where(IDIsBelowNumberFunc(10))
.Select(userName)
Donc vous pouvez voir que, parfois, il peut être plus facile d'utiliser la requête approche à la fois.