使用lambda删除在阵列中存在前2个字符的下拉列表中的项目



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更改为检查值的前2个字母是否存在于BlackListvendors字符串数组中。如果存在,它将删除下拉列表中的项目。

这是我想到的,但是有一个错误:

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

当我放置供应商时,似乎无法访问i.value。

错误:

错误39参数2:无法从"布尔"转换为 'system.func'

错误38'system.collections.generic.ienumerable' 不包含" Where"和最佳扩展的定义 方法超载 'system.linq.enumerable.Where(System.Collections.generic.Inumerable, system.func('有一些无效的参数

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

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));

最新更新