2010-06-18 59 views
1

最近我写了利用Lambda表达式一块的C#代码:MenuItemCollection与列表<MenuItem>

var dynMenu = new List<MenuItem>(); 
// some code to add menu items to dynMenu 
if (!dynMenu.Any(x => x.Text == controller)) 
{ 
    // do something 
} 

虽然要通过我的代码,我发现每个菜单项本身有一个名为ChildItems属性,它恰好是键入MenuItemCollection。有趣的是,我想我会用这个MenuItemCollection替换我的MenuItem列表。

改变后的第一行:

var dynMenu = new MenuItemCollection(); 

我注意到,这MenuItemCollection类型有像 “任何<>” 没有扩展方法, “所有<>”, “第一<>” 等,等 - 我觉得很奇怪。

有没有办法在这里使用Lambda表达式?

我应该回去使用“列表< < \ MenuItem>”吗?

+2

使用OfType ()扩展方法的AsQueryable扩展方法,它可以让您访问所有linq的优点。 – 2010-06-18 17:41:56

+0

@Darren,应该给出答案。 – 2010-06-18 17:43:57

+0

你的意思是这样吗? dynMenu.AsQueryable()。OfType ().Any(x => x.Text ==“something”); – Pretzel 2010-06-18 17:44:26

回答

8

MenuItemCollection是一个.NET 1.1类。它没有实现任何通用收集接口,特别是IEnumerable<MenuItem>

由于这只实现IEnumerable而不是IEnumerable<MenuItem>,所有的扩展方法LINQ都提供了这些方法,这些方法不起作用。但是,你可以通过做让他们回来:

if (dynMenu.Cast<MenuItem>().Any(x => x.Test == controller)) { // ... 

Cast扩展方法转换到IEnumerableIEnumerable<T>,提供访问其他LINQ扩展方法。

+0

阿哈。我没有意识到这是.NET 1.1 - 所以我不应该使用它?我基本上试图在ASP.NET MVC中构建一个动态构建的多嵌套导航栏,它似乎是一个合理的结构使用。 (而不是发明我自己的...) – Pretzel 2010-06-18 17:47:11

+0

@Pretzel:这取决于 - 我可能只是使用列表来代替。但是,如果你最终不得不创建一个MenuItemCollection,有时候可以更简单地使用它(很少见)。 – 2010-06-18 17:48:03

+0

嗯......好的。我会考虑一下。感谢您的建议和IEnumerable/Type课程! – Pretzel 2010-06-18 17:50:12

1

MenuItemCollection是一个专门的集合,并没有实现IEnumerable接口来使用上面提到的Linq扩展方法。我只是回到通用列表,因为它具有更多功能

+1

它确实实现了IEnumerable,而不是IEnumerable 。 – 2010-06-18 17:48:20