代码之家  ›  专栏  ›  技术社区  ›  Nifle Hassan Syed

需要foreach到linq提示

  •  2
  • Nifle Hassan Syed  · 技术社区  · 17 年前

    我在林克怎么做?

    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 回复  |  直到 17 年前
        1
  •  9
  •   Marc Gravell    17 年前

    怎么样:

    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 bit:

    foreach (var item in itemlist)
    {
        var dlist = item.examples.Select(ex => ex.GetDummy()).ToList();
        p.AddStuff(item.X,item.Y,dlist);
    }
    
        2
  •  3
  •   Davy Landman    17 年前

    如果 itemlist 是a 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和委托,而是因为它更好地陈述了代码的意图。

        3
  •  2
  •   Jon Norton    17 年前

    扩展马克的答案,你可以使用 All 将项目添加到p中,但这是滥用 所有 有点除非 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()));