正如标题所说,是否可以使用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的例子删除了有效的选择,留下了无效的选择,这与他的要求相反。
示例:
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);
}