2016-04-29 60 views
1

我只想知道如何在lambda表達式或linq中編寫以下代碼。請回答,如果你知道。如何在lambda表達式或linq中編寫下面的代碼?

Process[] runingProcess = Process.GetProcesses(); 
ManagementObjectCollection moReturn; 
ManagementObjectSearcher moSearch; 

void func() 
{                   
    moSearch = new ManagementObjectSearcher("Select * from Win32_Product"); 
    moReturn = moSearch.Get(); 
    foreach (ManagementObject mo in moReturn) 
    { 
     foreach (var process in Process.GetProcessesByName(mo["Name"].ToString())) 
     { 
      process.Kill(); 
     } 
    } 
} 
+1

您曾在同一嘗試還沒有任何的代碼片段? – fujiFX

+0

是fujiFX .VAR親= Process.GetProcesses()其中,(i =>(i.ProcessName = 「LMC」);! 的foreach(親VAR PRC) { prc.Kill();} 待辦事項 –

+0

你有一個代碼的例子,你可以從裏面調用'func'?lambda表達式簡單的取消了函數的名字並且把它變成了一個匿名函數,所以不是調用'myobj.Method(func);'你會調用'myobj.Method(()=> {/ *您的函數體在這裏... * /});' – gmiley

回答

1

這是LINQ等效迭代部分:

moReturn.Cast<ManagementBaseObject>().ToList().ForEach(mo => Process.GetProcessesByName(mo["Name"].ToString()).ToList().ForEach(proc => proc.Kill())); 

編輯:這個答案是語義上等同於在OP問題迭代,但它並沒有獲得任何。通過使用SelectMany來平息Processes而不是ForEach,查看更正確的其他upvoted答案。

+0

謝謝@hendry,但它顯示錯誤,像managemant對象集合不包含Tolist的定義 –

+0

@chinnathambir我的壞,應該先投它。請參閱編輯答案。 – Hendry

+0

@ hendry非常感謝它的正常工作 –

1

使用SelectMany來平整過程。

var moSearch = new ManagementObjectSearcher("Select * from Win32_Product"); 
    var moReturn = moSearch.Get(); 
    var processes = moReturn.Cast<ManagementObject>() 
          .SelectMany (mo => Process.GetProcessesByName(mo["Name"].ToString())) 
          .ToList(); 

     processes.ForEach(p=> p.Kill()); 

或在查詢語法

var moSearch = new ManagementObjectSearcher("Select * from Win32_Product"); 
    var moReturn = moSearch.Get(); 
    var processes = (from mo in moReturn.Cast<ManagementObject>() 
        from prc in Process.GetProcessesByName(mo["Name"].ToString()) 
        select prc).ToList(); 

     processes.ForEach(p=> p.Kill()); 
3

不同於其他的答案,我考慮使用.ToList().ForEach(...)是LINQ相反。一旦你使用這些關鍵字,你的LINQ查詢就結束了。特別是.ForEach(),因爲.ForEach(...)的目的是cause a side-effect,而LINQ用於查詢。

我的版本是:

// Query for processes to kill 
var data = new ManagementObjectSearcher("Select * from Win32_Product") 
    .Get() 
    .Cast<ManagementObject>() 
    .SelectMany(mo => Process.GetProcessesByName(mo["Name"].ToString())); 

// Kill the processes 
foreach (var item in data) { 
    item.Kill(); 
}