我如何在linq中执行此操作?
var p = new pmaker();
foreach (var item in itemlist)
{
var dlist = new List<Dummy>();
foreach (var example in item.examples)
{
dlist.Add(example.GetDummy());
}
p.AddStuff(item.X,item.Y,dlist);
}
// .. do stuff with p
答案 0 :(得分:9)
怎么样:
var qry = from item in itemlist
select new {item.X, item.Y,
Dummies = item.examples.Select(
ex => ex.GetDummy())
};
foreach (var item in qry)
{
p.AddStuff(item.X, item.Y, item.Dummies.ToList());
}
不确定它是否更加清晰,但是......我个人认为我可能只使用原来的foreach
版本......可能会将GetDummy
位分开:
foreach (var item in itemlist)
{
var dlist = item.examples.Select(ex => ex.GetDummy()).ToList();
p.AddStuff(item.X,item.Y,dlist);
}
答案 1 :(得分:3)
如果itemlist
是List<T>
集合,您可以这样做:
var p = new pmaker();
itemlist.ForEach(item =>
p.AddStuff(item.X, item.Y,
(from ex in item.examples
select ex.GetDummy()).ToList())
);
但如果这样更清楚了吗?我想不是,你不应该仅因为你喜欢而使用LINQ和委托,而是因为它更好地说明了代码的意图。
答案 2 :(得分:2)
扩展Marc的答案,您可以使用All
将项目添加到p,但除非All
失败,否则会稍微滥用p.AddStuff
。
(var qry = from item in itemlist
select new {item.X, item.Y,
Dummies = item.examples.Select(
ex => ex.GetDummy())
}).All(item=>{p.AddStuff(item.X, item.Y, item.Dummies.ToList()); return true;});
如果p.AddStuff
失败并且你想确定所有项目都已添加,那么这样做是完全合适的:
bool allAdded = (var qry = from item in itemlist
select new {item.X, item.Y,
Dummies = item.examples.Select(
ex => ex.GetDummy())
}).All(item=>p.AddStuff(item.X, item.Y, item.Dummies.ToList()));