2

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

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

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

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

编辑:对于那些感兴趣的人,这是我提出的“foreach”方式:

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

3 回答 3

9

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

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

所以,回答你的问题:

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

您必须使用 ToList() 或 ToArray() 或类似方法,因为在读取集合时无法修改集合 - ToList() 复制对所选项目的引用,然后可以循环并从 ListItemCollection 中删除。

在写这篇文章时,我看到了 Matten 的评论 - 他强调了 ListItemCollection 的有用功能(能够通过它们的 text 属性删除项目)但问题是错误的。要求是:您只允许在 ddlChoices.Items 中拥有“permittedChoices”。Matten 的示例删除了有效的选择并留下了与他所要求的相反的无效选择。

于 2012-07-25T14:32:06.133 回答
2

LINQ 是一种查询语言,它不用于修改您的数据。您可以做什么,它会根据您喜欢的条件查询您的项目列表,然后自行影响收藏。

样本:

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

并且您可以清除“项目”列表并仅添加您想要的相关内容。

ddlChoices.Clear();
ddlChoices.AddRange(relevant.ToArray());
于 2012-07-25T14:21:48.323 回答
1

只是为了使用linq?干得好 :-)

private static void FilterDropDownChoices(List<String> permittedChoices)
{
    ddlChoices.Items.Cast<ListItem>()
       .Where(li => permittedChoices.Contains(li.Text))
       .ToList()
       .ForEach(ddlChoices.Items.Remove);
}
于 2012-07-25T14:23:16.623 回答