的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)'有一些无效的参数
答案 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));