2010-06-18 5 views
1

최근 나는 람다 표현식 사용하는 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 
} 

내 코드를 통해가는 동안, 나는 각각의 MenuItem 자체의 될 일이 ChildItems라는 속성을 가지고 있다는 것을 발견 MenuItemCollection을 입력하십시오. 흥미롭게도, MenuItem의 List를이 MenuItemCollection으로 대체 할 것이라고 생각했습니다. 에 첫 선을 변경하면

가 :

var dynMenu = new MenuItemCollection(); 

내가이 MenuItemCollection 유형이 "모든 <>"와 같은 더 확장 방법이없는 것으로 나타났습니다, "모든 <>", "먼저 <>", 등, 등 - 나는 이상한 것을 안다.

여기에 람다 식을 활용할 수있는 방법이 있습니까?

"List < < \ MenuItem>"으로 돌아 가야합니까?

+2

OfType () 확장 메소드의 AsQueryable 확장 메소드를 사용하면 모든 linq 장점에 액세스 할 수 있습니다. –

+0

@ 대런, 그 대답을해야합니다. –

+0

이 뜻입니까? dynMenu.AsQueryable(). OfType () .Any (x => x.Text == "something"); – Pretzel

답변

8

MenuItemCollection은 .NET 1.1 클래스입니다. 일반 콜렉션 인터페이스는 구현하지 않습니다. 특히 IEnumerable<MenuItem>.

이것은 IEnumerable 만 구현하고 IEnumerable<MenuItem>이 아니기 때문에 LINQ가 제공하는 모든 확장 메서드가 제공하는 모든 기능이 작동하지 않습니다. 그러나, 당신은 수행하여 그들을 다시 얻을 수 있습니다 :

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

Cast 확장 방법은 다른 LINQ 확장 방법에 IEnumerableIEnumerable<T>에 제공하는 액세스 변환합니다.

+0

하. .NET 1.1인지 알지 못했습니다. 그래서 사용하지 않아야합니까? 저는 기본적으로 ASP.NET MVC에서 동적으로 구성된 다중 중첩 탐색 모음을 작성하려고합니다. 사용하기에 합당한 구조처럼 보입니다. (내 자신을 발명하기보다는 ...) – Pretzel

+0

@Pretzel : 그것은 달라질 수 있습니다 - 대신 목록 을 사용하는 것이 좋습니다. 그러나 MenuItemCollection을 최종적으로 만들어야하는 경우가 있는데, 때로는 앞에 사용하는 것이 더 쉽습니다 (드물지만). –

+0

흠 ... 좋아. 나는 그것에 대해 생각합니다. 조언과 IEnumerable/Type 레슨에 감사드립니다! – Pretzel

1

MenuItemCollection은 특수 컬렉션이며 위의 이름을 가진 Linq 확장 메서드를 사용하기 위해 IEnumerable 인터페이스를 구현하지 않습니다. 더 많은 기능을 가지고 있기 때문에 일반 목록으로 돌아갈 것입니다.

+1

그것은 IEnumerable을 구현하며, 단지 IEnumerable 이 아닙니다. –