2009-01-19 22 views
2

我如何在linq做到這一點?foreach到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 

回答

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); 
} 
+0

學習時不使用LINQ可能是同樣重要作爲知道什麼時候使用它:-) – Nifle 2009-01-19 12:56:57

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

延長Marc的回答你可以用All將項目添加到p,但它有點濫用All,除非​​可能會失敗。

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

如果​​可能會失敗,你希望確保添加所有的項目都像這樣做這將是完全適當的:

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