foreq to linq tip想要的

时间:2009-01-19 10:59:14

标签: c# linq

我如何在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

3 个答案:

答案 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)

如果itemlistList<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()));