Linq, лямбда - какое утверждение быстрее? - PullRequest
0 голосов
/ 10 января 2011

Мне было интересно, какое выражение быстрее, а какое предпочтительнее:

myList.Select(a => a.Property)
      .Where(a => !String.IsNullOrEmpty(a))

myList.Where(a => !String.IsNullOrEmpty(a.Property))
      .Select(a => a.Property)

и конечно почему?

Как правило, мой вопрос: я должен использовать Where, затем Select или Select, затем Where?

Ответы [ 4 ]

1 голос
/ 10 января 2011

Никто не может знать, вы должны измерить. Рассмотрим список из 50 пунктов, 40 из которых соответствуют критериям фильтра.

Затем проектируйте фильтр, этот подход минимизирует количество обращений к объекту. Свойство. 100 анонимных вызовов методов и 50 обращений к свойствам.

myList
   .Select(a => a.Property)
   .Where(a => !String.IsNullOrEmpty(a))

Фильтруйте затем проектируйте, этот подход минимизирует количество вызовов анонимных методов. 90 анонимных вызовов методов и 90 обращений к свойствам.

myList
   .Where(a => !String.IsNullOrEmpty(a.Property))
   .Select(a => a.Property) 

Поскольку мы не знаем затрат на реализацию вашего свойства по сравнению с затратами на анонимный вызов метода, нет причин рассуждать о разнице в производительности.

1 голос
/ 10 января 2011

Я бы предпочел второй, где вы сначала фильтруете данные (используя Where), а затем выбираете (используя Select), какие данные вам нужны.

В зависимости от данных, которые вы фильтруете, производительность может отличаться, но я чувствую, что второй поток больше.

0 голосов
/ 10 января 2011

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

Обратите внимание, что фильтрация не всегда происходит быстрее; сначала позвонив по номеру Select, вы будете выполнять меньше методов доступа к свойствам, но, скорее всего, разница в любом случае будет незначительной.

Если вы собираетесь писать более сложные запросы, я предлагаю написать как можно быстрее сокращая объем данных, что в данном случае означает запись Select перед Where: что приводит к сокращению кода который более читабелен в более длинных запросах: в конце концов, фокусируясь только на соответствующих битах (здесь - строках), читатель может игнорировать более сложные объекты, содержащие их в остальной части запроса. Однако такое преимущество довольно бессмысленно для такого маленького запроса.

0 голосов
/ 10 января 2011

Это зависит от поставщика Linq.

Например, в Linq2Sql оба оператора одинаковы, поскольку thwy будет генерировать одинаковый SQL для базы данных.

В Linq2Objects он может работать по-разному.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...