如何使用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;
}
}
有什么想法吗? 提前致谢
答案 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
(因为break
在if
之外,它只会添加该项目因此,无论是否符合条件,它都会在第一个项目上中断。上面的逻辑假设示例是错误的,并且如果其中任何具有非空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;