C# 选择仅返回一个元素

C# 选择仅返回一个元素,c#,linq,linq-to-xml,C#,Linq,Linq To Xml,也许我累了,但我不明白为什么这只是返回一个结果。程序下有三个程序元素,但我只得到了Excel作为结果。我错过了什么?为什么 XML: 您使用Element(“Program”)时,您希望使用复数元素,但您的循环不会像现在这样让您达到目的。试试类似的东西 var installedPrograms = (from serverRole in xlServerRoles.Descendants("ServerRole") where serverRo

也许我累了,但我不明白为什么这只是返回一个结果。程序下有三个程序元素,但我只得到了Excel作为结果。我错过了什么?为什么

XML:

您使用
Element(“Program”)
时,您希望使用复数
元素,但您的循环不会像现在这样让您达到目的。试试类似的东西

var installedPrograms = (from serverRole in xlServerRoles.Descendants("ServerRole")
                         where serverRole.Element("ServerType").Value == "Windows"
                         from program in serverRole.Element("Programs").Elements("Program")
                         select program.Value).ToList();
您使用
Element(“Program”)
时,您希望使用复数
元素,但您的循环不会像现在这样让您达到目的。试试类似的东西

var installedPrograms = (from serverRole in xlServerRoles.Descendants("ServerRole")
                         where serverRole.Element("ServerType").Value == "Windows"
                         from program in serverRole.Element("Programs").Elements("Program")
                         select program.Value).ToList();

这是因为Xml中只有一个
程序
,因此循环
foreach
只需循环一次,以便进行更多纠正:

        foreach (var prog in proggies.Descendants("Program").Select(p => new
        {
            programName = p.Value
        }))
        {
            alInstalledPrograms.Add(prog.programName.ToString());
        }
您可以直接在循环中获取子体
Program
,而不是
Programs
。对于缩短方法,您甚至不需要循环:

var alInstalledPrograms = xlServerRoles.Descendants("ServerRole")
            .Where(prg => prg.Element("ServerType").Value == "Windows")
            .Descendants("Program")
            .Select(p => p.Value)
            .ToList();

这是因为Xml中只有一个
程序
,因此循环
foreach
只需循环一次,以便进行更多纠正:

        foreach (var prog in proggies.Descendants("Program").Select(p => new
        {
            programName = p.Value
        }))
        {
            alInstalledPrograms.Add(prog.programName.ToString());
        }
您可以直接在循环中获取子体
Program
,而不是
Programs
。对于缩短方法,您甚至不需要循环:

var alInstalledPrograms = xlServerRoles.Descendants("ServerRole")
            .Where(prg => prg.Element("ServerType").Value == "Windows")
            .Descendants("Program")
            .Select(p => p.Value)
            .ToList();

谢谢你的例子和描述。谢谢你的例子和描述。谢谢,在两种解释之间,那真的帮助很大。谢谢,在两种解释之间,那真的帮助很大。