замените foreach для выражения LINQ - PullRequest
2 голосов
/ 28 июля 2010

Как я могу сделать это с помощью LINQ?

var prop = new List<EventProposal>();
foreach (var eventProposal in @event.Proposals)
      foreach (var service in eventProposal.Services)
      {
            if (!string.IsNullOrEmpty(service.LongDescription))
            {
                  prop.Add(eventProposal);
                  break;
            }
      }

Есть идеи? Заранее спасибо

Ответы [ 4 ]

2 голосов
/ 28 июля 2010

Синтаксис метода расширения:

prop = @event.Proposals.Where(p => p.Services.Any(
           s => !string.IsNullOrEmpty(s.LongDescription)).ToList();

Или запрос:

prop = (from p in @event.Proposals
        where p.Services.Any(s => !string.IsNullOrEmpty(s.LongDescription))
        select p).ToList();

ПРИМЕЧАНИЕ

Логика в вашем примере может отличаться от того, что вы намеревались; в существующем состоянии он будет добавлять элемент только в том случае, если first Service имеет непустое значение LongDescription (поскольку break находится за пределами if, поэтому он сломается при первом пункт независимо от того, соответствует ли он условию). Приведенная выше логика предполагает, что пример неправильный, и вы хотите добавить его, если любой из них имеет непустой LongDescription.

Если, однако, это то, что вы хотите, попробуйте это:

prop = @event.Proposals.Where(
       p => !string.IsNullOrEmpty(
       p.Services.Select(s => s.LongDescription).FirstOrDefault())).ToList(); 
0 голосов
/ 28 июля 2010
from proposal in @event.Proposals
where proposal.Services.Any(service => !String.IsNullOrEmpty(service.LongDescription))
select proposal;
0 голосов
/ 28 июля 2010
var prop = @event.Proposals
   .Where(proposal => proposal.Services.All(service => 
        !string.IsNullOrEmpty(service.LongDescription))))
   .ToList();

Возвращает все предложения в @event, где все услуги предложения имеют ненулевые значения LongDescription.ToList() является необязательным, только если вы хотите получить результат как IList<T> вместо IEnumerable<T>.

0 голосов
/ 28 июля 2010

Что-то в этом роде. У меня нет возможности компилировать и проверять это, и я не знаю, честно ли это, чем вложенный foreach.

var prop = @event.Proposals.Aggregate(
           new List<EventProposal>(), 
           (list, proposal) => { list.AddRange(proposal.Services
                                               .Where(service =>
                                                !string.IsNullOrEmpty(service.LongDescription)));                                      
                                 return list;
                                }
            );
...