访问 IEnumerable 中的特定属性

Accessing Specific Properties Inside IEnumerable

我正在尝试查询 XML 文档和 return 存储在 METEDATA 标记内的 COUNT 标记中的计数。问题是我很难访问 属性 strCount 以在程序中使用。我考虑过遍历 IEnumerable,但希望能够以更简洁的方式访问他的值。比如returncountQ.strCount我们的countQ["strCount"]。我知道这些在这种情况下不起作用,但想说明使用 属性 的名称的愿望我想要的值而不是索引或循环。

代码

Private XDocument doc = XDocument.Load(path);    

public class entityCount
{
    public string strCount { get; set; }
}


public IEnumerable<entityCount> queryCount(){
        var countQ = this.doc.Descendants("METADATA") .Select(m => new entityCount {
            strCount = m.Element("COUNT").Value
        });

        return countQ.....?;    
}

缩写 XML

<PRODUCTION_SET>
    <METADATA>
        <COUNT>322</COUNT>
    </METADATA>
    <ENTITY>
        <METADATA>
            <ID>1</ID>
            <foo>x</foo>
            <bar>y</bar>
        </METADATA>
    </ENTITY>
    .
    .
    .
    .
    .
    <ENTITY>
        <METADATA>
            <ID>322</ID>
            <foo>x</foo>
            <bar>y</bar>
        </METADATA>
    </ENTITY>
</PRODUCTION_SET>

您可以获得 IEnumerable<T> using First() or FirstOrDefault() 的第一项,例如:

var queryCountResult = countQ.FirstOrDefault();
if(queryCountResult !=null)
{
   var count = queryCountResult.strCount;
}

您可以将 IEnumerable 转换为列表并通过其索引访问元素:

int cnt = countQ.ToList()[0].strCount;
return cnt;

问题是,您的查询是否只 return 一项?如果你知道你只有一个项目,你可以只使用 First():

int cnt = countQ.First().strCount;
return cnt;

要获取第一个元数据标记中的计数,您可以这样做:countQ.First()

如果您只对 PRODUCTION_SET 中的元数据标签感兴趣,您可能不应该使用 Descendants(这会更深入地寻找它,即使在单个实体中,忽略上下文),但是而是找到 PRODUCTION_SET 标签,然后执行 .Elements().Select(...).Single()。 Single() 几乎与 First() 相同,但它将确保只有一个元素是您要查找的。在这种情况下,代码将如下所示:

public entityCount queryCount(){
    return this.doc.Root.Elements("METADATA").Select(m => new entityCount {
        strCount = m.Element("COUNT").Value
    }).Single();
}