2010-06-18 60 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