繁体   English   中英

如何使用LINQ同时搜索所有子项

[英]How to use LINQ to perform a simultaneous search of all child items

我的XML文件的结构如下:

<File>
<Setting1></Setting1>
<Setting2></Setting2>
<Options>
    <Option>
        <NameStartsWith>Br</NameStartsWith>
        <Data>1234</Data>
    </Option>
    <Option>
        <NameStartsWith>Ch</NameStartsWith>
        <Data>4567</Data>
</Option>
</Options>
</File>

我想做的是将LINQ用于类似下面的内容。

String Name = "Brian";
if(Name.StartsWith(LINQ.Any.NameStartsWith)))
{
 Console.WriteLine("The Answer is: " 1234);
}

目前,我通过使用foreach (XElement xe in Tests) <Option>字段来执行上述操作。 但是实际的XML文件比这要详细得多,并且循环变得难以管理。 理想情况下,我想使用LINQ一次搜索所有字段并将其简化为if或statement。

使用LINQ转换为Xml

string name = "Brian";
XDocument doc = XDocument.Load(yourXmlFile);
var matches = doc.Root
                 .Descendants("Option")
                 .Where(option => name.StartsWith(option.Element("NameStartsWith").Value))
                 .Select(option => option.Element("Data").Value);

foreach(var data in matches)
{
    Console.WriteLine("The Answer is: {data}");
}

XContainer.Descendants方法(XName)将返回当前XElement的所有层次结构中具有名称作为参数传递的所有元素。

如果元素NameStartsWithOption是可选的,则只需在LINQ方法链中添加对null的检查即可。 如果不存在这样的元素,则XElement.Element(XName name)将返回null

var matches = doc.Root
                 .Descendants("Option")
                 .Where(option => option.Element("NameStartsWith") != null)
                 .Where(option => name.StartsWith(option.Element("NameStartsWith").Value))
                 .Select(option => option.Element("Data").Value);

如果Option元素包含多个需要选择的其他元素,则创建一个代表所有所需数据的类,并将其填充到Select方法中

public class Option
{
    public string NameStartsWith {get; set; }
    public string Data {get; set; }
    public string ElementOne {get; set; }
    public string ElementTwo {get; set; }
}

var matches = doc.Root
                 .Descendants("Option")
                 .Where(option => option.Element("NameStartsWith") != null)
                 .Where(option => name.StartsWith(option.Element("NameStartsWith").Value))
                 .Select(option => new Option
                 {
                     NameStartsWith = option.Element("Data").Value,
                     Data = option.Element("Data").Value,
                     ElementOne = option.Element("ElementOne").Value,
                     ElementTwo = option.Element("ElementTwo").Value,
                 });

当然,您可以使用匿名类而不是创建一个。

也可以使用XPATH + Linq2Xml

string Name = "Brian";
var xDoc = XDocument.Parse(xmlstring); //or XDocument.Load(filename)
var matches = xDoc
       .XPathSelectElements($"//Option/NameStartsWith[starts-with('{Name}', text())]");  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM