Если оператор или Где расширение с циклом For Each? - PullRequest
2 голосов
/ 18 ноября 2009

Мне было интересно, какой из двух примеров кода будет более эффективным (или разница между ними незначительна)?

For Each apple in AppleController.GetRedApples().Where(Function(a) PriceController.OnSale(a))
   'do something
Next

или

For Each apple in AppleController.GetRedApples()
   If PriceController.OnSale(apple) Then
      'do something
   End If
Next

Спасибо!

Ответы [ 4 ]

2 голосов
/ 18 ноября 2009

Разница незначительна, и второй код гораздо более читабелен, поэтому вам, вероятно, предпочтительнее один

2 голосов
/ 18 ноября 2009

Я бы лично выделил это:

Dim applesOnSale = AppleController.GetRedApples() _
                                  .Where(Function(a) PriceController.OnSale(a))
For Each apple in applesOnSale
   'do something
Next

В полной IDE первая часть может быть одной строкой - или вы можете использовать выражение запроса VB, например:

Dim applesOnSale = From apple in AppleController.GetRedApples() _
                   Where PriceController.OnSale(apple)

For Each apple in applesOnSale
   'do something
Next

Это отделяет «какие элементы вас интересуют» от «того, что вы хотите делать с элементами», что я лично считаю полезным с точки зрения читабельности.

Обратите внимание, что в некоторых ситуациях Where может не работать, однако - если GetRedApples возвращает таблицу из LINQ to SQL DataContext, например, он попытается перевести предложение Where в SQL - который не будет работать.

При условии, что вы используете LINQ to Objects, присваивание фактически не будет выполнять зацикливание - оно просто настроит запрос. Предложение "where" будет оцениваться только для каждого элемента при циклическом выполнении запроса.

0 голосов
/ 18 ноября 2009

Производительность должна быть примерно одинаковой, поэтому я бы выбрал более читаемый подход:

var applesOnSale = from apple in AppleController.GetRedApples()
                   where PriceController.OnSale(apple)
                   select apple;

foreach(var apple in applesOnSale)
{
    //do stuff
}

Это то же самое, что и второй вариант, но на ощупь он более читабелен.

0 голосов
/ 18 ноября 2009

Рассмотрите это обсуждение foreach против linq / lambda (также ответите Jon Skeet ;-), и этот, если вы хотите углубиться в понимание эффективности LINQ / Lambda и производительности .

...