选择具有条件的第二项的项目

时间:2017-01-18 14:15:19

标签: c# linq

我有以下XML:

   <Test>
        <parent>
            <child>
                <Qualifier>S</Qualifier>
                <Number>11</Number>
            </child>
            <child>
                <Qualifier>S</Qualifier>
                <Number>12</Number>
            </child>
            <child>
                <Qualifier>B</Qualifier>
                <Number>3</Number>
            </child>
        </parent>
    </Test>
    <Test>
        <parent>
            <child>
                <Qualifier>S</Qualifier>
                <Number>15</Number>
            </child>
            <child>
                <Qualifier>S</Qualifier>
                <Number>16</Number>
            </child>
            <child>
                <Qualifier>B</Qualifier>
                <Number>3</Number>
            </child>
        </parent>
    </Test>

我正在从我的C#代码中读取这个XML。

有一个Test数组,里面有一个parent数组,里面有一个child数组。

我想获得Test元素,其中第二 child ,限定符为 S 等于12

如何使用linQ选择项目条件限定符的第二个元素==“S”等于12?

我试过了:

   var test = Test.Where(e => e.parent.First().child[1].Qualifier == "S" &&
                        e.parent.First().child[1].Number == referenceNumber).FirstOrDefault();

但是我想要一些更有活力的东西,因为有些情况下它不是第二个元素。所以我将在更广泛的范围内使用linQ查询。

3 个答案:

答案 0 :(得分:0)

tests.Select(x => x.Parents.Select(y => y.Childs.Select(z => z.Qualifier == "S" & z.Number == 12).Any()).Any())

答案 1 :(得分:0)

假设您将上述内容加载到类似命名的类中:

还假设第二个有S的孩子可能实际上不是Child [1]:

var test = Tests.Where(t => t.Parents.Count == 1 && t.Parents[0].Children.Select(c => c.Qualifier == "S").Count() >= 2)
.Where(t => t.Parents[0].Children.Where(c => c.Qualifier == "S").ElementAt(1).Number == 12);

答案 2 :(得分:0)

这将为您提供父母拥有第二个S限定符子项且编号为12的所有测试的列表。

tests.Where(t => 
    t.Parents.Any(p => 
        p.Children.Where(c => c.Qualifier == "S")
            .Skip(1)
            .Select(cc => cc.Number)
            .FirstOrDefault() == 12)).ToList()