如何使用linq在列表/IEnumerable中查找子元素?

如何使用linq在列表/IEnumerable中查找子元素?,linq,linq-to-xml,Linq,Linq To Xml,我有一个XML结构,可以解析并作为IEnumerable返回: <menuItem Id="1"> <menuItem Id="2"> <menuItem Id="5"> <menuItem Id="9"> <criterion></criterion> </men

我有一个XML结构,可以解析并作为IEnumerable返回:

 <menuItem Id="1">
      <menuItem Id="2">
            <menuItem Id="5">
                  <menuItem Id="9">
                       <criterion></criterion>
                  </menuItem>
             </menuItem>
       </menuItem>
  </menuItem>
  <menuItem Id="10>
    /// huge xml document from here on...
问题是这里的IEnumerable只有14项。这些是父项,所以如果我在寻找Id==9,那么就找不到它,因为它是Id 1的子元素

如何编辑上面的linq语句,以便它使用名为menuItem的元素检查每个级别,而不仅仅是检查所涉及Id的父级

更新:

IEnumerable如下所示:

  Count=14
 +MenuItem //nested menuItem
  Name

您可以先将层次结构展平(linq本身不支持这一点),然后再做您正在做的事情

e、 g

…然后

var item = menuItems.Flatten(y => y.MenuItems).Where(x => x.Id == 5)
    .FirstOrDefault();

如何解析它?包括代码。MenuItem类是什么样子的?它如何代表它的孩子?(你真的有4级深的菜单结构吗?)不幸的是,我的客户要求在某些地方有6级深。现在发布我的MenuItem类,确切地说,哪些项目位于从
XmlConverter.Parser()返回的
IEnumerable
中?嵌套项是否存在?是的,它们存在并且嵌套在内部。我将发布IEnumerable的外观。我将对此进行研究。我真的希望Linq有一些内置的魔法我不这么认为-你不会损失太多-它列举了-直到它找到一个-唯一的问题可能是你想要什么顺序,深度优先等等。我想你可以调整一下。因为我使用的是Xml,而且文档没有一百万行长,所以它在列表中的移动速度都会很快。我主要需要根据他的例子让代码正常工作你不应该有太多的菜单项:)-是的。因为您处理的是linq to对象,所以您可以做这样的事情。
 var criteria = menuItems.Where(x => x.Id == menuItem.Id)
                         .Select(x => x.Criteria)
                         .FirstOrDefault();
  Count=14
 +MenuItem //nested menuItem
  Name
var item = menuItems.Flatten(y => y.MenuItems).Where(x => x.Id == 5)
    .FirstOrDefault();