Uzatma yöntemleri vs sorgu sözdizimi sözdizimi
Eğer lambda ifadeleri ile standart seri anahtar ya da seri uzatma yöntemleri kullanmak için iyi bir zaman varsa ele almaya çalışıyorum. Aynı şeyi yapmak gibi görünüyor, farklı yazılır. Tamamen tarz meselesi mi?
var query = from p in Products
where p.Name.Contains("foo")
orderby c.Name
select p;
// or with extension methods:
var query = Products
.Where(p => p.Name.Contains("foo")
.OrderBy(p => p.Name);
İkinci örnek biraz daha kısa, ama ne olduğunu bilmiyorsun bile belki daha az etkileyici = ^ olmak çok benziyorlar . yapıyor.
Kısa kod yazmak dışında, SERİ sözdizimi aksine uzatma yöntemleri kullanarak başka avantajları var mı?
CEVAP
Dürüst olmak gerekirse, bazen Funcs ve Eylemleri kullanmaya başladığınızda durum olabilir. Demek bu üç funcs kullanıyorsanız:
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;
Gördüğünüz gibi ilk kişi değiştirir lamdba ifade almak için kullanıcı adı, ikinci değiştirir bir lamdba ifade kullanılan kontrol ederseniz KİMLİĞİ daha düşük 10, ve kabul edelim, üçüncü olması çok kolay değil.
Bu saçma bir örnek ama işe yarıyor. NOT:
var userList =
from user in userList
where userIDOverTen(user)
select userName;
Karşı
var otherList =
userList
.Where(IDIsBelowNumber)
.Select(userName)
Bu örnekte, ikincisi biraz daha az ayrıntılı beri uzatma yöntemi yapmak tam kullanımı bu İşlev, ama o Seri ifade edemez beri bak sadece bir Boolean yerine bir İşlev döndüren boolean. Ancak, bu daha iyi olacağını ifade dili kullanmaktır. Ki zaten daha sadece bir kullanıcı daha götüren bir yöntemi vardı:
private Boolean IDIsBelowNumber(DataClasses.User user,
Int32 someNumber, Boolean doSomething)
{
return user.UserID < someNumber;
}
Not: bir şey uzatma yöntemi kullanıcı bir tamsayı alan bir yöntem ile iyi ve boolean verir, çünkü sadece orada. Bu örnek için biraz rahatsız edici.
Eğer Etmeniz sorgu bakarsanız şimdi:
var completeList =
from user in userList
where IDIsBelowNumber(user, 10, true)
select userName;
Bunun için iyi bir konum. Şimdi Uzatma Yöntemi:
var otherList =
userList
.Where(IDIsBelowNumber????)
.Select(userName)
Lambda ifadesi olmadan, ben gerçekten bu yöntemi çağırın. Şimdi ne yapmam gerektiğini bir İşlev özgün yöntem iptal temel oluşturan bir yöntem oluşturun.
private Func<DataClasses.User, Boolean> IDIsBelowNumberFunc(Int32 number)
{
return user => IDIsBelowNumber(user, number, true);
}
Ve sonra takın:
var otherList =
userList
.Where(IDIsBelowNumberFunc(10))
.Select(userName)
Gördüğünüz gibi, bazen sadece zaman sorgu yaklaşımı kullanmak daha kolay olabilir.
@medya sorgu ve ASP.NET MVC razor sözd...
&Lt ne diyor;&m>''=~m lt;...
Ne bir scala için bir öğe eklemek için...
Eclipse tercihlerinizi kaydetmek ve ge...
Hemen işlev çağırma sözdizimi...