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

Liste

.NET 2.0 (1)
.NET Allgemein (16)
.NET Fu (5)
ADO.NET (11)
Aprilscherz (3)
ASP Grundlagen (44)
ASP Tricks (83)
ASP.NET (44)
ASPIntranet.de (5)
C# (28)
Datenbank (44)
Dokumentation (4)
IIS 6.0 (1)
Komponenten (29)
Optimierung (10)
Server (21)
Sicherheit (34)
Tee Off (6)
VB.NET (6)
WAP (8)
Web Services (11)
XML (9)

RSS 2.0 - Die neuesten fünf Artikel auf AspHeute.com


 

Suchen





 

English Articles
Chinese Articles
Unsere Autoren
 
Link zu AspHeute
Impressum
Werben
Anfragen

Das foreach Statement

Geschrieben von: Christoph Wille
Kategorie: C#

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.

Download des Codes

Klicken Sie hier, um den Download zu starten.

Verwandte Artikel

Arrays mit Index und Schlüssel
Ausgabe der Event Log Einträge a la ASP.NET
Collections einmal anders: Stacks und Queues
Die Hashtable Klasse
Kontrollstatements in C#
On-the-fly Erstellung von vCard's
Regex'en zu Assemblies kompilieren
Schleifenbefehle in C#
Sortieren mit dem IComparer Interface
Variable Parameterlisten in Funktionen

Links zu anderen Sites

Die aspDEdotnet Liste

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

Bewerten Sie diesen Artikel
 Sehr gut   Nicht genügend  
   1  2  3  4  5  
 

  
   Für Ausdruck optimierte Seite

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