C# Can';似乎没有将Linq与ASP.Net导航菜单一起使用
我有以下代码:C# Can';似乎没有将Linq与ASP.Net导航菜单一起使用,c#,linq,navigationbar,C#,Linq,Navigationbar,我有以下代码: // Iterate through the root menu items in the Items collection. foreach (MenuItem item in NavigationMenu.Items) { if (item.NavigateUrl.ToLower() == ThisPage.ToLower()) { item.Sel
// 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;
然后,我可以设置项的所选值,但它在导航菜单上给了我一个错误。Items
错误5找不到的查询模式的实现
源类型“System.Web.UI.WebControls.MenuItemCollection”在哪里
没有找到。考虑显式指定范围的类型
变量“i”
当我注释掉where
子句时,我得到以下错误:
错误22找不到的查询模式的实现
源类型“System.Web.UI.WebControls.MenuItemCollection”选择'
没有找到。考虑显式指定范围的类型
变量“i”
我怀疑导航菜单。项
只实现IEnumerable
,而不是IEnumerable
。要解决此问题,您可能需要调用Cast
,这可以通过在查询中显式指定元素类型来完成:
var item = from MenuItem i in NavigationMenu.Items
where i.NavigateUrl.ToLower() == ThisPage.ToLower()
select i;
然而,您的查询的名称有误导性——它是一系列的事情,而不是一个单独的项目
我还建议使用a来比较管柱,而不是上套管。例如:
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));
var items=NavigationMenu.items.Cast()
其中(item=>item.NavigateUrl.Equals)(此页,
StringComparison.CurrentCultureInogoreCase);
Ohh……这是个巧妙的把戏!我希望我能更早地了解强制转换
。为了将来的参考,值得真正阅读错误消息-它给出了与我完全相同的建议:显式指定范围变量的类型。当我注释掉Linq语句的where
部分时,就会出现该消息。当我取消注释where
语句时,它给了我一个不同的错误。@Neil:那错误消息是什么?一般来说,在类似这样的问答网站上,如果不指定错误消息本身,就说“它给了我一个错误”从来都不是一个好主意。@Neil:这不是一个完全不同的错误消息-它仍然准确地告诉你需要做什么来修复它:)