Controls 컬렉션에서 IEnumberable 메서드를 모두 제공하지 않는 이유는 무엇입니까?
ASP의 Control Collection이 어떻게 되는지 잘 모르겠습니다.네트워크가 연결되어 있으니 누군가가 저를 위해 이것을 밝혀줄 수도 있어요.
저는 최근에 확장 방법과 Linq라는 마법을 발견했습니다.음, 저는 이것이 유효한 구문이 아니라는 것을 알게 되어 매우 슬펐습니다.
var c=Controls.Where(x => x.ID=="Some ID").SingleOrDefault();
하지만 제가 봤을 때는Controls
다음을 구현합니까?IEnumerable
그러한 방법을 제공하는 인터페이스, 그래서 무엇을 제공합니까?왜 안 되는 거지?저는 적어도 이 문제에 대한 적절한 해결책을 찾았습니다.
var list = (IEnumerable<Control>)Controls;
var this_item = list.Where(x => x.ID == "Some ID").SingleOrDefault();
아니요.IEnumerable
확장 방법이 많지 않습니다.IEnumerable<T>
그렇다. 그것들은 두 개의 별개의 인터페이스이다, 하지만.IEnumerable<T>
확장된IEnumerable
.
일반적인 LINQ 변환 방법은 비일반 인터페이스를 확장하는 및 확장 방법을 사용하는 것입니다.
IEnumerable<TextBox> textBoxes = Controls.OfType<TextBox>();
IEnumerable<Control> controls = Controls.Cast<Control>();
둘의 차이점은OfType
필수 유형이 아닌 항목은 건너뜁니다.Cast
대신 예외를 던집니다.
제네릭에 대한 참조를 얻으면IEnumerable<T>
나머지 LINQ 메서드를 모두 사용할 수 있습니다.
이것은 단지 수업이 제네릭보다 먼저 왔기 때문입니다; 그래서 그것은 구현합니다.IEnumerable
하지만 아닙니다.IEnumerable<Control>
.
다행히도, LINQ 확장 방법이IEnumerable
생성할 수 있는 인터페이스IEnumerable<T>
캐스팅을 통해: .즉, 언제든지 이 작업을 수행할 수 있습니다.
var c = Controls.Cast<Control>().Where(x => x.ID == "Some ID").SingleOrDefault();
Jon Skeet 및 Dan Tao가 제공한 답변 외에도 유형을 명시적으로 제공하여 쿼리 표현식 구문을 사용할 수 있습니다.
Control myControl = (from Control control in this.Controls
where control.ID == "Some ID"
select control).SingleOrDefault();
Linq는 제네릭 컬렉션을 사용했습니다.ControlsCollection 구현체IEnumerable
것은 아니다.IEnumberable<T>
이 방법이 작동하지 않습니다.
((IEnumerable)page.Controls).Where(...
그러나, 이것은
((IEnumerable<Control>)page.Controls).Where(...
일반으로 캐스팅할 수 있습니다.IEnumerable<T>
또는 다음과 같은 확장 메서드에 액세스합니다.
page.Controls.OfType<Control>().Where(c => c.ID == "Some ID").FirstOrDefault();
언급URL : https://stackoverflow.com/questions/3302435/why-doesnt-the-controls-collection-provide-all-of-the-ienumerable-methods
'IT' 카테고리의 다른 글
구독에서 관찰 가능한 항목을 반환하는 방법 (0) | 2023.08.06 |
---|---|
자바스크립트를 사용하여 페이지의 메타 태그를 변경할 수 있습니까? (0) | 2023.08.06 |
검색 뷰를 사용하여 Recycler 뷰를 필터링하는 방법 (0) | 2023.08.06 |
타임리프를 사용하여 템플릿을 부모 레이아웃으로 래핑 (0) | 2023.08.06 |
PHP: 단어로 된 숫자 표현 (0) | 2023.08.06 |