MenuItemCollection vs. List <MenuItem> - PullRequest
2 голосов
/ 18 июня 2010

Недавно я написал фрагмент кода на C # с использованием лямбда-выражения:

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

Проходя по моему коду, я обнаружил, что у каждого MenuItem есть свойство ChildItems, которое имеет тип MenuItemCollection. Заинтригованный, я подумал, что заменил бы свой Список MenuItem этой коллекцией MenuItem.

После изменения первой строки на:

var dynMenu = new MenuItemCollection();

Я заметил, что этот тип MenuItemCollection не имеет методов расширения, таких как «Any <>», «All <>», «First <>» и т. Д. И т. Д., Что я нахожу странным.

Есть ли способ использовать здесь лямбда-выражения?

Должен ли я просто вернуться к использованию "List << \ MenuItem>"?

Ответы [ 2 ]

9 голосов
/ 18 июня 2010

MenuItemCollection - это класс .NET 1.1.Он не реализует ни один из универсальных интерфейсов коллекции, в частности, IEnumerable<MenuItem>.

. Поскольку он реализует только IEnumerable, а не IEnumerable<MenuItem>, все методы расширения, которые предоставляет LINQ, требуют, чтобы это не работало.Однако вы можете вернуть их, выполнив:

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

Метод расширения Cast преобразует IEnumerable в IEnumerable<T>, предоставляя доступ к другим методам расширения LINQ.

1 голос
/ 18 июня 2010

MenuItemCollection является специализированной коллекцией и не реализует интерфейс IEnumerable для использования методов расширения Linq, которые вы назвали выше.Я бы просто вернулся к общему списку, так как он обладает большей функциональностью

...