Warum nicht die Controls-Auflistung alle von der IEnumerable-Methoden?
Ich bin mir nicht sicher, wie die ControlCollection des ASP.Net arbeitet, so vielleicht kann jemand etwas Licht in diese Schuppen für mich.
Habe ich vor kurzem entdeckt die Magie, erweiterungsmethoden und Linq. Gut, ich war sehr traurig zu erfahren, dass diese nicht gültig ist syntax
var c=Controls.Where(x => x.ID=="Some ID").SingleOrDefault();
Aber was ich sagen kann, Controls
tut implementieren die IEnumerable
Schnittstelle, die diese Methoden mit sich, so was gibt? Warum das nicht funktioniert? Ich habe eine menschenwürdige Arbeit, um für dieses Problem zumindest:
var list = (IEnumerable<Control>)Controls;
var this_item = list.Where(x => x.ID == "Some ID").SingleOrDefault();
- Sie tun kann
list.SingleOrDefault(x => x.ID == "Some ID");
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein,
IEnumerable
hat nicht viele Erweiterung Methoden auf:IEnumerable<T>
tut. Es sind zwei getrennte Schnittstellen, obwohlIEnumerable<T>
erstrecktIEnumerable
.Den normalen LINQ-Möglichkeiten der Umwandlung zu verwenden, die
Cast<T>()
undOfType<T>()
Erweiterung Methoden welche tun erweitern die nongeneric Schnittstelle:Den Unterschied zwischen den beiden ist, dass
OfType
werde einfach überspringen alle items, die nicht in der benötigten Art;Cast
wird eine exception werfen statt.Sobald Sie haben Bezüge zu den generischen
IEnumerable<T>
geben, alle restlichen LINQ-Methoden zur Verfügung stehen.Dies ist nur, weil die
ControlCollection
Klasse kam um, bevor Generika; so ist es implementiertIEnumerable
aber nichtIEnumerable<Control>
.Glücklicherweise, es existiert eine LINQ-extension-Methode auf die
IEnumerable
Schnittstelle, die Ihnen erlaubt generieren eineIEnumerable<T>
durch casting:Cast<T>
. Das bedeutet, man kann immer nur dazu:Zusätzlich zu den Antworten von Jon Skeet und Dan Tao, können Sie mithilfe von query-expression-syntax, indem Sie explizit die Bereitstellung der Typ.
Linq verwendet Generische Sammlungen. ControlsCollection implementiert
IEnumerable
nichtIEnumberable<T>
Wenn Sie feststellen, das wird nicht funktionieren
Allerdings bedeutet dies
Können Sie entweder werfen, um Generische
IEnumerable<T>
oder auf eine extension-Methode, die funktioniert, etwa so: