我可以使用linq从asp.net DropDownList.items中删除项目吗



正如标题所说,是否可以使用LINQ从DropDownList中删除项目。项目与我指定的字符串不相等的项目?

换句话说,我有一个字符串列表,如果一个Item与列表中的任何字符串都不匹配,它就会被删除。

注意:我知道如何实现这一点,我可以用foreach循环来实现。这很好,但我想知道是否有LINQ的替代方案。

EDIT:我应该说-Item的.Text属性匹配字符串列表中的任何项。

编辑:对于那些感兴趣的人来说,这是我建议的"foreach"方式:

        private void FilterDropDownChoices(List<String> permittedChoices)
        {
            foreach(ListItem item in ddlChoices.Items)
            {
                if (!permittedChoices.Contains(item.Text))
                {
                    ddlChoices.Items.Remove(item);
                }
            }
        }

ryanulit实际上提供了最好的答案。

问题是ListItemCollection只实现了IEnumerable接口。LINQ扩展在IEnumerable<T>。因此,将(IEnumerable)强制转换为(IEnumarable<T>)-您现在可以使用LINQ了。

因此,为了回答您的问题:

ddlChoices.Items
.Cast<ListItem>()
.Where(item => !permittedChoices.Contains(item.Text))
.ToList()
.ForEach(ddlChoices.Items.Remove);

您必须使用ToList()或ToArray()或类似的方法,因为在读取集合时无法修改集合-ToList(。

在写这篇文章的时候,我看到了Matten的评论——他强调了ListItemCollection的有用功能(能够通过其文本属性删除项目),但却弄错了问题。要求是:你只能在ddlChoices.Items中有"permittedChoices"。Matten的例子删除了有效的选择,留下了无效的选择,这与他的要求相反。

LINQ是一种查询语言,不用于修改数据。你可以做的是,它在你的项目列表中查询你喜欢的条件,然后自己进行收集。

示例:

var relevant = from item in list.Items
               where permittedChoices.Contains(item.ToString())
               select item

然后您可以清除"项目"列表,只添加所需的相关项目。

ddlChoices.Clear();
ddlChoices.AddRange(relevant.ToArray());

只使用linq?给你:-)

private static void FilterDropDownChoices(List<String> permittedChoices)
{
    ddlChoices.Items.Cast<ListItem>()
       .Where(li => permittedChoices.Contains(li.Text))
       .ToList()
       .ForEach(ddlChoices.Items.Remove);
}

最新更新