将foreach替换为LINQ表达式

时间:2010-07-28 00:15:22

标签: c# linq-to-objects foreach

如何使用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 个答案:

答案 0 :(得分:2)

扩展方法语法:

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();

注意

你的例子中的逻辑可能不是你想要的;如果第一个 Service具有非空LongDescription(因为breakif之外,它只会添加该项目因此,无论是否符合条件,它都会在第一个项目上中断。上面的逻辑假设示例是错误的,并且如果其中任何具有非空LongDescription,则要添加它。

但是,如果这就是你想要的,那么试试这个:

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

答案 1 :(得分:0)

这些方面的东西。没有能力编译和检查这个,我不知道它是否真的比嵌套的foreach更清晰。

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

答案 2 :(得分:0)

var prop = @event.Proposals
   .Where(proposal => proposal.Services.All(service => 
        !string.IsNullOrEmpty(service.LongDescription))))
   .ToList();

这将返回@event中所有提案的所有服务都具有非空LongDescription值的提案。仅当您希望结果为ToList()而不是IList<T>时,IEnumerable<T>才是可选的。

答案 3 :(得分:0)

from proposal in @event.Proposals
where proposal.Services.Any(service => !String.IsNullOrEmpty(service.LongDescription))
select proposal;