Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Das foreach Statement

Geschrieben von: Christoph Wille
Kategorie: C#

This printed page brought to you by AlphaSierraPapa

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 Syntax

Schauen 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 Beispiele

Alternativ 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ßbemerkung

In 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.

This printed page brought to you by AlphaSierraPapa

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20000720.zip

Verwandte Artikel

Arrays mit Index und Schlüssel
http:/www.aspheute.com/artikel/20020124.htm
Ausgabe der Event Log Einträge a la ASP.NET
http:/www.aspheute.com/artikel/20000811.htm
Collections einmal anders: Stacks und Queues
http:/www.aspheute.com/artikel/20000926.htm
Die Hashtable Klasse
http:/www.aspheute.com/artikel/20000823.htm
Kontrollstatements in C#
http:/www.aspheute.com/artikel/20000714.htm
On-the-fly Erstellung von vCard's
http:/www.aspheute.com/artikel/20020906.htm
Regex'en zu Assemblies kompilieren
http:/www.aspheute.com/artikel/20020902.htm
Schleifenbefehle in C#
http:/www.aspheute.com/artikel/20000717.htm
Sortieren mit dem IComparer Interface
http:/www.aspheute.com/artikel/20020417.htm
Variable Parameterlisten in Funktionen
http:/www.aspheute.com/artikel/20020125.htm

Links zu anderen Sites

Die aspDEdotnet Liste
http://www.aspgerman.com/aspgerman/listen/anmelden/aspDEdotnet.asp

 

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.