LINQ表达式中的切入和切出

时间:2018-11-18 17:22:16

标签: c# asp.net linq

我有一组单选按钮,它们放置在它们自己的容器中以用于CSS样式。他们看起来像这样:

<div id="radiobuttonscontainer" runat="server">
    <div class="buttoncontainer">
        <asp:RadioButton ID="rb1" runat="server" GroupName="rbgroup"/>
    </div>
    <div class="buttoncontainer">
        <asp:RadioButton ID="rb2" runat="server" GroupName="rbgroup"/>
    </div>
</div>

我想对这些按钮进行分组,并找到选中的按钮。这似乎是GroupName的逻辑功能,但事实并非如此。

如果它们都在单个<div>容器中,我可以使用简单的LINQ查询在它们之间循环:

var checkedButton = radiobuttonscontainer.Controls.OfType<RadioButton>()
                                  .FirstOrDefault(r => r.Checked);

我可以修改此表达式以进入和退出buttoncontainer div吗?

1 个答案:

答案 0 :(得分:1)

我没有使用HTML控件,而是将buttoncontainer div元素更改为asp:Panel元素,因为这些元素在最终HTML中呈现为div元素,同时允许将它们视为。 NET对象。然后,我可以执行特定的嵌套LINQ查询,如下所示:

RadioButton selected = radiobuttonscontainer.Controls.OfType<Panel>() .SelectMany(c => c.Controls.OfType<RadioButton>()) .FirstOrDefault(r => r.Checked);

第一次迭代(radiobuttonscontainer.Controls.OfType<Panel>())返回容器中的所有Panel对象,但添加了.SelectMany(c => c.Controls.OfType<RadioButton>())后,该选择将精炼为任何RadioButton对象在第一个选择中(即Panels的IE“进入和退出”)。这是因为我用SelectMany的{​​{1}}参数专门标识了这些控件。

由于我的设计在每个面板中只允许一个c => c.Controls.OfType<RadioButton>()元素,所以这不是问题,但是如果我有多个RadioButton元素,则可能必须优化参数以使其更具体取决于用例。

最后一部分(RadioButton)进一步细化选择,返回被检查的第一个.FirstOrDefault(r => r.Checked)对象。由于在这种情况下只能选择一个RadioButton,因此这仅满足并返回单个对象。如果可以检查多个RadioButton,则需要使用另一个RadioButton表达式而不是SelectMany,并且返回的对象将是FirstOrDefault对象的列表或数组。

非常感谢C#聊天中的Tom Wmilleniumbug的帮助。