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