Das foreach Statement
Geschrieben von: Christoph Wille Ein Statement, das es in C++ nicht gab, ist das foreach Statment. Für VBScript Programmierer allerdings ist es ein alter Bekannter, unter einen anderen Namen: For...Each. In diesem Artikel betrachten wir die Unterschiede, vor allem bei der Abarbeitung der ServerVariables und QueryString Collections. Voraussetzung um den Sourcecode dieses Artikels verwenden zu können ist eine Installation des Microsoft .NET Framework SDK's auf einem Webserver. Weiters setze ich voraus, daß der Leser bereits eine Programmiersprache beherrscht - deshalb ist die Information auch in sehr komprimierter Form gehalten. Die SyntaxSchauen wir uns noch einmal die von VBScript her bekannte Syntax des For...Each Statements an: <% For Each key in Request.QueryString Response.Write key & "=" & Request.QueryString(key) & "<br>" Next %> Das For...Each Statement iteriert einfach über eine Collection, in diesem Fall über die QueryString Collection. Wenn man diese Seite mit einem Query String aufruft http://localhost/foreach.asp?Location=Orlando&Name=Christoph dann erhält man logischerweise folgenden Output: Location=Orlando Name=Christoph Will man dieses Beispiel nun nach ASP.NET und C# portieren, dann sind die Unterschiede nicht sehr gravierend: <% @Page Language="C#" %> <% foreach (string strKey in Request.QueryString.AllKeys) { Response.Write(strKey); Response.Write("="); Response.Write(Request.QueryString.Get(strKey)); Response.Write("<br>"); } %> Um die QueryString Collection im foreach Statement auflisten zu können, muß man die AllKeys Eigenschaft verwenden, um an das Array der Keys zu kommen. Jedes Element dieses Arrays wird dann in die Variable strKey eingelesen, um dann kann man das Ergebnis am Bildschirm ausgeben. Es dürfte zwar bereits aus dem vorhin gezeigten Beispiel hervorgehen, aber ich bin ich Ihnen immer noch die generelle Syntax eines foreach Statements schuldig: foreach (VariablenName in CollectionName) { ... } Wie gesagt, anhand der Beispiels hätte man die Syntax auch "erraten" können. Weitere BeispieleAlternativ zur Verwendung von foreach hätte man die QueryString Collection auch anders ausgeben können: <% @Page Language="C#" %> <% // alternative Methode NameValueCollection collQS = Request.QueryString; int nCount = collQS.Count; for (int i=0;i < nCount;i++) { Response.Write(collQS.GetKey(i)); Response.Write("="); Response.Write(collQS.Get(i)); Response.Write("<br>"); } %> Im gezeigten Beispiel referenziere ich die QueryString Collection in einer lokalen Variable des Typs NameValueCollection - dies ist der tatsächliche Typ der QueryString Collection. Damit erspare ich mir einiges an Tipparbeit, und kann zeigen, wie universell Collections sich im Framework wiederfinden. Wenn man nun folgenden URL aufruft http://localhost/alternate.aspx?Location=Orlando&Name=Christoph &Location=Leoben dann erhält man folgenden Output: Location=Orlando,Leoben Name=Christoph Die Elemente der Location sind als gesamter String zurückgegeben worden, und nicht als Einzelelemente. Das wäre auch mit dem ASP Sourcecode, als auch dem ASP.NET foreach Beispiel passiert. Um das "Problem" zu beheben, kann man folgenden Sourcecode verwenden (foreach2.aspx): <% @Page Language="C#" %> <% foreach (string strKey in Request.QueryString.AllKeys) { Response.Write(strKey); Response.Write("="); string[] astrValues = Request.QueryString.GetValues(strKey); for (int i=0;i<astrValues.Length;i++) { Response.Write(astrValues[i]); if (i != (astrValues.Length-1)) Response.Write(", "); } Response.Write("<br>"); } %> Nun werden alle Mehrfachelemente der QueryString Collection korrekt angegriffen und ausgegeben. Dieses Beispiel kann man gleich in das Codearsenal für ASP.NET aufnehmen, da man es möglicherweise öfter benötigen wird. Als abschließendes Beispiel möchte ich noch zeigen, wie man die ServerVariables Collection in ASP.NET mit dem foreach Statement "dumpen" kann. <% @Page Language="C#" %> <pre> <% foreach (string strKey in Request.ServerVariables.AllKeys) { // diese Variable auslassen if ("ALL_HTTP" == strKey) continue; // einfache Ausgabe am Bildschirm Response.Write(strKey); Response.Write("="); Response.Write(Request.ServerVariables.Get(strKey)); Response.Write("<br>"); } %> </pre> Dieses Beispiel gibt alle Server Variablen exklusive ALL_HTTP aus, weil diese ja nur wieder alle anderen Variablen beeinhaltet. Das Beispiel habe ich deshalb gebracht, weil in ASP.NET kaum jemand mehr die ServerVariables Collection in dieser Art und Weise angreifen wird - weil (fast) alle Items nun auch als Eigenschaften des Request Objekts verfügbar sind, so zum Beispiel: <% @Page Language="C#" %> <pre> <% Response.Write(Request.UserHostAddress + "<br>"); Response.Write(Request.UserAgent + "<br>"); Response.Write(Request.FilePath + "<br>"); %> </pre> Früher mußte man diese Daten (REMOTE_HOST, HTTP_USER_AGENT, SCRIPT_NAME) über die ServerVariables Collection auslesen - jetzt hat man typisierten Zugriff über Eigenschaften. Mehr zu diesen Neuerungen in weiteren Artikeln über ASP.NET. SchlußbemerkungIn diesem Artikel habe ich Ihnen das foreach Statement von C# näher gebracht, und im Zuge der Erklärung seiner Verwendung auch noch die QueryString und ServerVariables Collections von ASP.NET "gestreift". Nun haben Sie genug C# Basiswissen, um bereits jetzt interessante ASP.NET Seiten zu schreiben. Download des CodesKlicken Sie hier, um den Download zu starten. Verwandte Artikel
Arrays mit Index und Schlüssel Links zu anderen SitesWenn Sie jetzt Fragen haben...Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten. Eine weitere sehr hilfreiche Resource ist das deutsche ASP.NET Wiki, das als zentrale Anlaufstelle für Tips, Tricks, Know How und alles Nützliche was man in seinem Alltag als (ASP).NET-Entwickler so braucht und entdeckt gedacht ist. Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.
Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.
©2000-2006 AspHeute.com |