2009-03-23 14 views
1

Bezug nehmend auf meine Frage auf filtering ('constraining') types in a foreach loop, ich versuche die erste Methode in Charlie Flowers Antwort, mit der .Where-Methode für die Sammlung, aber der Compiler kann .Woher auf dem System nicht finden .Web.UI.ControlCollection-Klasse. Dies ist von IEnumerable abgeleitet, also, was ist das Problem hier?Problem mit 'where()' Methode

foreach (var control in Controls.Where(i => i.GetType() == typeof(TextBox))) 

Antwort

4

Zuerst sicherstellen, dass Sie using System.Linq; an der Spitze der Datei haben.

Wenn Sie eine Sammlung, die IEnumerable implementiert, aber nicht IEnumerable<T>, aber Sie kennen die Objekte sind alle eines bestimmten Typs (wie Control), dann können Sie die Cast<T> LINQ Extension-Methode verwenden:

foreach (var control in Controls.Cast<Control>() 
     .Where(i => i.GetType() == typeof(TextBox))) {...} 

Doch angesichts Ihrer Where Klausel, könnte es sinnvoll sein, in diesem Fall zu verwenden, um die OfType<T> Verfahren, das nur diejenigen eines bestimmten Typs zurückgibt (Cast<T> löst eine Ausnahme aus, wenn etwas falsch ist):

foreach (var control in Controls.OfType<TextBox>()) {...} 

Der kleine Unterschied zwischen dieser und Ihrer Version besteht darin, dass die oben genannten Unterklassen TextBox zurückgeben, wo Ihre GetType() == typeof(TextBox) Version nicht. Grundsätzlich

, die meisten der LINQ Erweiterungsmethoden definiert sind, nur für IEnumerable<T>/IQueryable<T>, nicht IEnumerable/IQueryable.

+0

Danke. Ich habe tatsächlich versucht, in einem Beispiel "wo" zu verwenden, um von OfType zu unterscheiden, um nur exakte Typen zu erhalten, nicht alle zuweisbaren Typen. Die Besetzung funktioniert gut. – ProfK