2017-02-24 64 views
1

我进程名的XML文件的清单,我试图比较它们的过程当前在本地机器上运行。我已成功地实现它在foreach循环,但我非常喜欢我的代码是越来越具有循环拥挤Linq中执行它。我可以;吨完全得到语法正确的,虽然......使用LINQ to进程名比较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进程名的列表(取决于你的XML结构:xdoc.Descendants("Process").Select(x=>x.Value).ToList()
  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文件中的一些过程项是部分名称(例如iexplo的IEXPLORE)。我将如何扭转'processList.Contains'是'ProcessName.Contains'如果你明白我的意思吗? – James

+0

'如果(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