IT

Controls 컬렉션에서 IEnumberable 메서드를 모두 제공하지 않는 이유는 무엇입니까?

itgroup 2023. 8. 6. 09:59
반응형

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

반응형