使用lambda删除dropdownlist中的项目WHERE前两个字符存在于数组中

时间:2018-03-28 02:23:51

标签: c# asp.net linq lambda drop-down-menu

的Web.config:

<add key="blacklistVendors" value="01,02"/>

ASPX

string[] blacklistVendors= ConfigurationManager.AppSettings["blacklistVendors"].Split(',');

ddlVendor.Items.Cast<ListItem>().Where(i => i.Value == "It").ToList().ForEach(i => ddlVendor.Items.Remove(i));

我想将i.Value更改为检查blacklistVendors字符串数组中是否存在值的前2个字母。如果它存在,它将删除下拉列表中的项目。

这是我提出的一些内容,但它有一个错误:

ddlTicketVendor.Items.Cast<ListItem>().Where(vendorSeries.Any(i => i.Value.Substring(0, 2))).ToList().ForEach(i => ddlTicketVendor.Items.Remove(i));

当我将vendorSeries.Any放在Where

中时,似乎无法访问i.Value

错误:

  

错误39参数2:无法从'bool'转换为   'System.Func'

     

错误38'System.Collections.Generic.IEnumerable'   不包含“Where”和最佳扩展名的定义   方法过载   “System.Linq.Enumerable.Where(System.Collections.Generic.IEnumerable,   System.Func)'有一些无效的参数

1 个答案:

答案 0 :(得分:2)

这是编译器抱怨的表达式:

vendorSeries.Any(i => i.Value.Substring(0, 2))

您无法将其传递给Where,因为它不是Func<ListItem,bool>

以下是解决问题的方法:

ddlTicketVendor.Items.Cast<ListItem>()
    .Select(i => new {Item = i, Prefix = i.Value.Substring(0, 2)})
    .Where(i => vendorSeries.Any(s => i.Prefix == s))
    .ToList()
    .ForEach(i => ddlTicketVendor.Items.Remove(i.Item));

选择匿名对确保我们每个项目计算一次i.Value.Substring(0, 2)。上面的代码假设vendorSeries是我们比较项目的两个字符前缀的集合。您可以通过构造HashSet<string>禁用前缀来进一步简化此代码:

var bannedPrefix = new HashSet<string>(vendorSeries);
ddlTicketVendor.Items.Cast<ListItem>()
    .Where(i => !bannedPrefix.Contains(i.Value.Substring(0, 2)))
    .ToList()
    .ForEach(i => ddlTicketVendor.Items.Remove(i));