SORU
11 Kasım 2008, Salı


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
12 Kasım 2008, ÇARŞAMBA


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • cosmicrocketman

    cosmicrocket

    17 NİSAN 2006
  • Motor Trend Channel

    Motor Trend

    11 Mart 2006
  • Phlearn Photoshop and Photography Tutorials

    Phlearn Phot

    11 EKİM 2011