4

我有以下代码:

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

然后我可以设置 的Selecteditem,但它给了我一个错误NavigationMenu.Items

错误 5 找不到源类型“System.Web.UI.WebControls.MenuItemCollection”的查询模式的实现。'哪里' 没有找到。考虑明确指定范围变量“i”的类型。

当我注释掉该where子句时,我收到此错误:

错误 22 找不到源类型“System.Web.UI.WebControls.MenuItemCollection”的查询模式的实现。未找到“选择”。考虑明确指定范围变量“i”的类型。

4

1 回答 1

5

我怀疑NavigationMenu.Items只有工具IEnumerable,不是IEnumerable<T>。要解决此问题,您可能需要调用Cast,这可以通过在查询中显式指定元素类型来完成:

var item = from MenuItem i in NavigationMenu.Items
           where i.NavigateUrl.ToLower() == ThisPage.ToLower()
           select i;

但是,您的查询被误导了 - 它是一系列事物,而不是单个项目。

我还建议使用 aStringComparison来比较字符串,而不是大写它们。例如:

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));
于 2011-08-05T09:28:08.087 回答