2009-10-22 2 views
7

Могу ли я упростить это утверждение с помощью выражения лямбда?Lambda Expression

var project = from a in accounts 
       from ap in a.AccountProjects 
       where ap.AccountProjectID == accountProjectId 
       select ap; 

ответ

3

Честно говоря, это выглядит довольно ясно для меня. Я думаю, что лямбда в этом случае может быть менее читаемой, т. Е. Что-то вроде Брэндона, опубликованного ниже.

(Stolen от должности Брэндона)

var project = accounts.Select(a => a.AccountProjects) 
         .Where(x => x.AccountProjectID == accountProjectId); 

Насколько читаемость, то я думаю, что пара петель предпочтительнее решение лямбды, и я думаю, что ваше решение является предпочтительным петлями.

+4

Это зависит от того, как вы его пишете - добавьте разрыв строки перед «.Where», и вдруг лямбда на самом деле довольно читаема. –

+1

Я вроде согласен с Эд. То, что у вас сейчас, прекрасно читается, лямбда на самом деле ничего не упрощает. Это, вероятно, будет вопросом предпочтения, если что-нибудь. – Brandon

+1

Даже с разрывом линии, для меня это еще менее читаемо, но я думаю, что это субъективная вещь. Думаю, дело в том, это совершенно ясно, переходите к реальной проблеме! :) –

4
var project = accounts.SelectMany(a => a.AccountProjects) 
         .Where(x => x.AccountProjectID == accountProjectId); 

Действительно ли это на самом деле проще, это вопрос вкуса.

+0

Я думаю, что несколько из предложений концептуально проще, чем неявно сглаживающий SelectMany, но независимо от того, не является ли смысл синтаксиса LINQ давать более чистый синтаксис, чем эти цепные методы? – Joren

+0

Оба подхода концептуально эквивалентны. Они делают то же самое. Они представляют собой два разных способа выражения одних и тех же наборов операций. Как я отметил в своем ответе, который вы считаете «более чистым» или «более простым», это вопрос вкуса. – Mark

2

Я согласен с Ed Swangren. Это выглядит кратким и достаточно читаемым.

На самом деле, ответ на ваш вопрос зависит от 3-х вещей:

  1. То, что вы хотите достичь - лучшей читаемости? лучшая производительность? и т. д.
  2. Тип «счетов»
  3. Как будет получен результирующий сбор.

Если вам нужна более высокая производительность, и в случае, если «учетные записи» являются списком, и результирующая коллекция будет итерирована или передана другому методу для повторения достаточно скоро после этих строк кода, я бы сделал что-то подобное :

List<Account> filteredAccounts = new List<Account>(); 
accounts.ForEach(a => { if (a.AccountProjectID == accountProjectId) filteredAccounts.Add(a); }); 

Конечно, это менее читаемым, то ваше заявление LINQ, но я хотел бы использовать эти 2 линии, а не accounts.Select .......

И, конечно, это гораздо лучше оптимизированы для работы, которая Я всегда считаю важным.

+2

Какая польза от этого при вызове 'ToList()' в запросе LINQ? –

+0

Вопрос не просил вас его оптимизировать, он попросил вас упростить его. Вы также делаете довольно большое предположение, когда говорите, что он «намного лучше оптимизирован для производительности». Вы действительно протестировали его? У вас есть данные для резервного копирования вашего предположения? – Mark

+0

1. То, что вы называете упрощением, - дело вкуса. Думаю, я ответил на этот вопрос в своем предыдущем посте. 2. Конечно, я протестировал его. Другой вопрос я бы не опубликовал. Проблема заключается не в вызове ToList в запросе. В среднем LINQ для объектов более чем в два раза медленнее, чем традиционные методы (например, итерация с использованием цикла foreach). Не верьте мне? Вы можете легко протестировать ее только с помощью Google. И метод расширения ForEach, используемый здесь вместе с лямбда-выражением, дает вам даже лучшую производительность, чем цикл foreach. Я приложил немало усилий для изучения того, что стоит, поверьте мне. – Alexander

0
accounts 
    .SelectMany (
     a => AccountProjects, 
     (a, ct) => 
     new 
     { 
      a = a, 
      ap = ap 
     } 
    ) 
    .Where (t => (t.ap.AccountProjectID == t.a.accountProjectId)) 
    .Select (t => t.ap)