我有以下代码:
// Iterate through the root menu items in the Items collection.
foreach (MenuItem item in NavigationMenu.Items)
{
if (item.NavigateUrl.ToLower() == ThisPage.ToLower())
{
item.Selected = true;
}
}
我想要的是:
var item = from i in NavigationMenu.Items
where i.NavigateUrl.ToLower() == ThisPage.ToLower()
select i;
然后我可以设置Selected
的{{1}}值,但它会在item
上给我一个错误。
错误5无法找到查询模式的实现 源类型'System.Web.UI.WebControls.MenuItemCollection'。 '哪里' 未找到。请考虑明确指定范围的类型 变量'i'。
当我注释掉NavigationMenu.Items
子句时,我收到此错误:
错误22无法找到查询模式的实现 源类型'System.Web.UI.WebControls.MenuItemCollection'。 '选择' 未找到。请考虑明确指定范围的类型 变量'i'。
答案 0 :(得分:5)
我怀疑NavigationMenu.Items
只实现了IEnumerable
,而不是IEnumerable<T>
。要解决此问题,您可能需要调用Cast
,这可以通过在查询中显式指定元素类型来完成:
var item = from MenuItem i in NavigationMenu.Items
where i.NavigateUrl.ToLower() == ThisPage.ToLower()
select i;
但是,您的查询名称误导 - 它是事物的序列,而不是单个项目。
我还建议使用StringComparison
比较字符串,而不是将它们置于上限。例如:
var items = from MenuItem i in NavigationMenu.Items
where i.NavigateUrl.Equals(ThisPage,
StringComparison.CurrentCultureIgnoreCase)
select i;
然后我会考虑使用扩展方法:
var items = NavigationMenu.Items.Cast<MenuItem>()
.Where(item => item.NavigateUrl.Equals(ThisPage,
StringComparison.CurrentCultureIgnoreCase));