2017-02-24 10 views
1

XMLファイルにプロセス名のリストがあり、ローカルマシン上で現在実行中のプロセスと比較しようとしています。私はforeachループでそれを達成することができましたが、私のコードがループで混雑しているので、Linqでそれを実行するのが理想的です。 Iができ、かなり右しかし構文を取得するのt ...Linqを使用してプロセス名をXMLリストと比較する

XDocument xdoc; // this is populated elsewhere 
Process[] allProcesses = Process.GetProcesses();    

if (allProcesses.Any(_ => xdoc.Descendants("Process").ToList().Contains(_)) {} 

私は何とか比較としてallProcesses.ProcessName.Anyを使用する必要があるので、それはあると思うが、ProcessNameのは文句を言わない私はプロセスを経て、foreachループを実行せずに自己を公開。あなたはこれを試みることができる

+0

xmlの構造は何ですか? – octavioccl

答えて

2

を使用してプロセスをフィルタリングします。

  1. (あなたのXML構造に依存:xdoc.Descendants("Process").Select(x=>x.Value).ToList())XMLからプロセス名のリストを取得します
  2. Process名(process.ProcessName

と比較してくださいので、それは次のようになります。

XDocument xdoc; // this is populated elsewhere 

var processList = xdoc.Descendants("Process").Select(x=>x.Value).ToList(); 
Process[] allProcesses = Process.GetProcesses();    

if (allProcesses.Any(p => processList.Contains(p.ProcessName)) {} 
+0

ありがとうございます。パーフェクト:) – James

+0

私のXMLファイルでは、いくつかのプロセス項目は部分的な名前です(例:iexploreの場合はiexplo)。私が何を意味するのか見れば、 'ProcessList.Contains'を' ProcessName.Contains'にするにはどうすればいいですか? – James

+0

'if(allProcesses.Any(p => processList.Any(pr => p.Contains(pr)))){}' –

1

var processNames=xdoc.Descendants("Process").Select(e=>e.Value); 
var selectedProcess=allProcesses.Where(p=>processNames.Contains(p.ProcessName)); 

まずあなたは、プロセスの名前を比較する必要があなたのXMLからプロセス名を選択して、後でそのコレクションに

+0

Downvoterなぜ説明できますか? – octavioccl

関連する問題