访问IEnumerable中的特定属性

时间:2016-12-21 15:52:21

标签: c# xml linq ienumerable

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

CODE

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>

3 个答案:

答案 0 :(得分:3)

要获取第一个元数据标记中的计数,您可以执行以下操作:countQ.First()

如果您感兴趣的只是直接在PRODUCTION_SET中的元数据标签,您可能不应该使用后代(即使在单个实体中也会更深入地查找它,忽略上下文),而是找到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();
}

答案 1 :(得分:2)

您可以转换IEnumerable&lt; T&gt;到列表并通过索引访问元素:

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

问题是,您的查询是否只返回一个项目?如果您知道自己只有一个项目,则可以使用First()

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

答案 2 :(得分:0)

您可以使用IEnumerable<T>First()获取FirstOrDefault()的第一项:

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