我现有的工作正常。我很好奇是否有更好的方法通过Linq实现这一目标。目前我正在声明一个ArrayList,填充然后再运行。我可以运行单个linq语句来拉取Windows程序,然后将Linux程序附加到列表中吗?
foreach (var winProgram in allWinPrograms.Descendants("Programs").Select(p => new
{
progName = p.Element("ProgramName").Value
}))
{
alTemp.Add(winProgram.progName.ToString());
}
foreach (var linProgram in allLinPrograms.Descendants("Programs").Select(p => new
{
progName = p.Element("ProgramName").Value
}))
{
alTemp.Add(linProgram.progName.ToString());
}
foreach (string newProgram in alTemp)
{
if (!alPrograms.Contains(newProgram))
{
alPrograms.Add(newProgram);
}
}
答案 0 :(得分:2)
假设allWinPrograms
和allLinPrograms
的后代属于同一类型,您应该能够像这样使用LINQ的Concat
:
var sorted = allWinPrograms.Descendants("Programs")
.Concat(allLinPrograms.Descendants("Programs"))
.Select(p => p.Element("ProgramName").Value.ToString())
.Distinct();
答案 1 :(得分:0)
简短解决方案
foreach (var prg in allWinPrograms.Union(allLinPrograms).Select(x => x).Where(prg =>!allPrograms.Contains(prg)))
{
allPrograms.Add(prg);
}
长期解决方案
foreach (var prg in allWinPrograms.Union(allLinPrograms).Select(x => x))
{
if (!allPrograms.Contains(prg))
{
allPrograms.Add(prg);
}
}
答案 2 :(得分:-1)
如果你把所有东西都放在同一条线上,它的可读性如何?您可以从linq执行中获得一些性能优势,但也要记住干净的代码。
foreach (var winProgram in allWinPrograms.Descendants("Programs").Select(p => new
{
progName = p.Element("ProgramName").Value
}))
{
alTemp.Add(winProgram.progName);
}
foreach (var linProgram in allLinPrograms.Descendants("Programs").Select(p => new
{
progName = p.Element("ProgramName").Value
}))
{
alTemp.Add(linProgram.progName);
}
foreach (string newProgram in alTemp.Cast<string>().Where(newProgram => !alPrograms.Contains(newProgram)))
{
alPrograms.Add(newProgram);
}