如何在LINQ序列中获取元素范围?

5

我有一个关于集合的查询:

Panel thePanel = menuCell.Controls.OfType<Panel>()
                    .Where(panel => panel.Controls.OfType<HyperLink>().Any(
                        label => label.ID == clas))
                    .FirstOrDefault();

这将仅获取具有特定ID的超链接的面板。我不仅需要获取firstOrDefault,而且还需要获取序列中匹配的元素(仅第一个)和接下来的2个元素。我没有尝试任何东西,因为不知道该怎么做。


问题不清楚。像“第一”,“接下来的两个”这样的术语意味着任何顺序。IEnumearble(Of T) 不是有序序列。因此,当我们使用上述术语时,必须确切地设置排序条件。 - Hamlet Hakobyan
“First”是匹配的元素,接下来的两个是紧随匹配元素后面的两个元素。 - anmarti
匹配的元素可以不止一个,如果没有确切的顺序,接下来的两个元素可以是任意两个。 - Hamlet Hakobyan
不,只会有一个匹配的元素。 - anmarti
下面两个意味着从匹配的元素开始进行简单迭代。 "IEnumerable公开枚举器,它支持对非泛型集合的简单迭代。" - bAN
OK. 但下面的 2 个可以是任意 2 个。 - Hamlet Hakobyan
2个回答

7
这将返回前三个带有特定id超链接的面板。
var thePanels = menuCell.Controls.OfType<Panel>()
                    .Where(panel => panel.Controls.OfType<HyperLink>()
                                         .Any(label => label.ID == clas))
                    .Take(3);

如果您需要第一个带有特定id超链接的面板,并且接下来的两个面板不管它们具有什么:

var thePanels = menuCell.Controls.OfType<Panel>()
                        .SkipWhile(panel => !panel.Controls.OfType<HyperLink>()
                                                 .Any(label => label.ID == clas))
                        .Take(3);

1
我认为那不正确。它不会返回匹配的元素和接下来的两个元素(可能不匹配)。它会返回前三个匹配项。 - fero
是的,只有第一个必须与ID匹配,后面两个只是序列中的下一个。 - anmarti
@bAN...但有点困难 ;) - anmarti

1
如果您想找到符合特定条件的一个面板,然后取出它和接下来的两个面板,无论它们是否满足条件,您可以这样做:
IEnumerable<Panel> thePanelAndTwoNext = menuCell.Controls.OfType<Panel>()
                .SkipWhile(panel => !panel.Controls.OfType<HyperLink>()
                                       .Any(label => label.ID == clas))
                .Take(3);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接