<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>.Net 2.0</title>
        <link>http://blogs.escde.net/sascha/category/9.aspx</link>
        <description>.Net 2.0</description>
        <language>en-US</language>
        <copyright>Sascha</copyright>
        <managingEditor>frietsch@escde.net</managingEditor>
        <generator>Subtext Version 1.9.3.0</generator>
        <item>
            <title>Bild nach Bytearray nach Bild</title>
            <link>http://blogs.escde.net/sascha/archive/2007/07/29/85.aspx</link>
            <description>&lt;p&gt;Um binäre Dateien, wie etwa Bilder, über einen Webservice zu senden oder empfangen, kann man sie in ein ByteArray konvertieren.&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] createByteArray(&lt;span class="kwrd"&gt;string&lt;/span&gt; imageName) 
{
   FileInfo fileInfo = &lt;span class="kwrd"&gt;new&lt;/span&gt; FileInfo(imageName);
   FileStream fileStream = fileInfo.OpenRead();
   &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] byteArray = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[fileStream.Length];        
   &lt;span class="kwrd"&gt;int&lt;/span&gt; bytesRead = fileStream.Read(byteArray, 0, fileStream.Length);
   Console.WriteLine(&lt;span class="str"&gt;"{0} bytes have been read from {1}"&lt;/span&gt;, 
   bytesRead.ToString(), imageName);
   &lt;span class="kwrd"&gt;return&lt;/span&gt; byteArray;
}&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
]]&gt;&lt;/style&gt;

&lt;p&gt;In die andere Richtung:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; saveAsImage(&lt;span class="kwrd"&gt;byte&lt;/span&gt;[] bytes, &lt;span class="kwrd"&gt;string&lt;/span&gt; imageName) 
{
   MemoryStream memStream = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream(bytes);
   System.Drawing.Image image = 
   System.Drawing.Image.FromStream(memStream);
   image.Save(imageName);
   Console.WriteLine(&lt;span class="str"&gt;"{0} was created successfully."&lt;/span&gt;, imageName);
}&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
]]&gt;&lt;/style&gt;&lt;img src="http://blogs.escde.net/sascha/aggbug/85.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Sascha</dc:creator>
            <guid>http://blogs.escde.net/sascha/archive/2007/07/29/85.aspx</guid>
            <pubDate>Sun, 29 Jul 2007 12:01:57 GMT</pubDate>
            <comments>http://blogs.escde.net/sascha/archive/2007/07/29/85.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.escde.net/sascha/comments/commentRss/85.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.escde.net/sascha/services/trackbacks/85.aspx</trackback:ping>
        </item>
        <item>
            <title>ADO.Net und Excel</title>
            <link>http://blogs.escde.net/sascha/archive/2007/07/05/83.aspx</link>
            <description>&lt;p&gt;Der Zugriff auf Exceldateien unter .Net 2.0 ist dank ADO.Net erstaunlich einfach. Dazu wird der OleDbProvider verwendet.&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;string&lt;/span&gt; connectionString = &lt;span class="str"&gt;@"Provider=Microsoft.Jet.OLEDB.4.0;
    Data Source=D:\Excel\Workbook.xls;Extended Properties="&lt;/span&gt;&lt;span class="str"&gt;"Excel 8.0;HDR=YES;"&lt;/span&gt;&lt;span class="str"&gt;""&lt;/span&gt;;&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
]]&gt;&lt;/style&gt;

&lt;p&gt;Dieser ConnectionString enthält den Speicherort der Datei und gibt an, dass die erste Zeile der Worksheets die Spaltennamen enthält.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.escde.net/images/blogs_escde_net_86/sascha/WindowsLiveWriter/ADO.NetundExcel_13356/image%7B0%7D%5B4%5D.png" target="_new" atomicselection="true"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="209" src="http://blogs.escde.net/images/blogs_escde_net_86/sascha/WindowsLiveWriter/ADO.NetundExcel_13356/image%7B0%7D_thumb%5B2%5D.png" width="240" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Nachdem die Connection geöffnet ist, verhält sich alles, wie von ADO.Net gewohnt.&lt;br /&gt;Mit Hilfe der GetSchema() Methode lassen sich Informationen zu den vorhandenen Tabellen (gleich Worksheets) und Spalten abrufen.&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; (OleDbConnection connection = &lt;span class="kwrd"&gt;new&lt;/span&gt; OleDbConnection(connectionString))
{
    connection.Open();

    DataTable tables = connection.GetSchema(&lt;span class="str"&gt;"Tables"&lt;/span&gt;);
    DataTable columns = connection.GetSchema(&lt;span class="str"&gt;"Columns"&lt;/span&gt;);
}&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
]]&gt;&lt;/style&gt;

&lt;p&gt;In den nachfolgenden Screenshots sieht man die jeweilige DataTable mit den Schemainformationen im DataSet-Visualizer des Visual Studio Debuggers. Achtung: Excel hängt für den Tabellenname ein $ an den Namen des Worksheets. Hier: Worksheetname "Studenten" wird zu Tabelle "Studenten$".&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.escde.net/images/blogs_escde_net_86/sascha/WindowsLiveWriter/ADO.NetundExcel_13356/image%7B0%7D%5B7%5D.png" target="_new" atomicselection="true"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="143" src="http://blogs.escde.net/images/blogs_escde_net_86/sascha/WindowsLiveWriter/ADO.NetundExcel_13356/image%7B0%7D_thumb%5B3%5D.png" width="240" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.escde.net/images/blogs_escde_net_86/sascha/WindowsLiveWriter/ADO.NetundExcel_13356/image%7B0%7D%5B10%5D.png" target="_new" atomicselection="true"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="144" src="http://blogs.escde.net/images/blogs_escde_net_86/sascha/WindowsLiveWriter/ADO.NetundExcel_13356/image%7B0%7D_thumb%5B4%5D.png" width="240" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Select-Abfragen funktionieren auch mit Parameter und das Ergebnis lässt sich an Steuerelemente binden.&lt;/p&gt;&lt;pre class="csharpcode"&gt;OleDbCommand selectCommand = &lt;span class="kwrd"&gt;new&lt;/span&gt; OleDbCommand(
    &lt;span class="str"&gt;"SELECT [MatrikelNr], [Vorname], [Nachname] FROM [Studenten$] "&lt;/span&gt; +
    &lt;span class="str"&gt;"WHERE [Nachname] LIKE @Nachname"&lt;/span&gt;, 
    connection);
selectCommand.Parameters.AddWithValue(&lt;span class="str"&gt;"Nachname"&lt;/span&gt;, &lt;span class="str"&gt;"A%"&lt;/span&gt;);

OleDbDataAdapter adapter = &lt;span class="kwrd"&gt;new&lt;/span&gt; OleDbDataAdapter(selectCommand);

DataTable studenten = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataTable();
adapter.Fill(studenten);

&lt;span class="kwrd"&gt;this&lt;/span&gt;.GridView1.DataSource = studenten;
&lt;span class="kwrd"&gt;this&lt;/span&gt;.GridView1.DataBind();&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
]]&gt;&lt;/style&gt;

&lt;p&gt;&lt;a href="http://blogs.escde.net/images/blogs_escde_net_86/sascha/WindowsLiveWriter/ADO.NetundExcel_13356/image%7B0%7D%5B13%5D.png" target="_new" atomicselection="true"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="139" src="http://blogs.escde.net/images/blogs_escde_net_86/sascha/WindowsLiveWriter/ADO.NetundExcel_13356/image%7B0%7D_thumb%5B5%5D.png" width="240" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Auch die Insert- und Update-Commands funktionieren wie erwartet:&lt;/p&gt;&lt;pre class="csharpcode"&gt;OleDbCommand insertCommand = &lt;span class="kwrd"&gt;new&lt;/span&gt; OleDbCommand(
    &lt;span class="str"&gt;"INSERT INTO [Studenten$] ([MatrikelNr], [Vorname], [Nachname]) "&lt;/span&gt; +  
    &lt;span class="str"&gt;"VALUES (@MatrikelNR, @Vorname, @Nachname)"&lt;/span&gt;,
    connection);
insertCommand.Parameters.AddWithValue(&lt;span class="str"&gt;"MatrikelNr"&lt;/span&gt;, &lt;span class="str"&gt;"123459"&lt;/span&gt;);
insertCommand.Parameters.AddWithValue(&lt;span class="str"&gt;"Vorname"&lt;/span&gt;, &lt;span class="str"&gt;"Bert"&lt;/span&gt;);
insertCommand.Parameters.AddWithValue(&lt;span class="str"&gt;"Nachname"&lt;/span&gt;, &lt;span class="str"&gt;"Becker"&lt;/span&gt;);
&lt;span class="kwrd"&gt;int&lt;/span&gt; rowsAffected = insertCommand.ExecuteNonQuery();&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
]]&gt;&lt;/style&gt;

&lt;p&gt;&lt;a href="http://blogs.escde.net/images/blogs_escde_net_86/sascha/WindowsLiveWriter/ADO.NetundExcel_13356/image%7B0%7D%5B16%5D.png" target="_new" atomicselection="true"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="210" src="http://blogs.escde.net/images/blogs_escde_net_86/sascha/WindowsLiveWriter/ADO.NetundExcel_13356/image%7B0%7D_thumb%5B6%5D.png" width="240" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
]]&gt;&lt;/style&gt;&lt;img src="http://blogs.escde.net/sascha/aggbug/83.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Sascha</dc:creator>
            <guid>http://blogs.escde.net/sascha/archive/2007/07/05/83.aspx</guid>
            <pubDate>Thu, 05 Jul 2007 19:51:49 GMT</pubDate>
            <comments>http://blogs.escde.net/sascha/archive/2007/07/05/83.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blogs.escde.net/sascha/comments/commentRss/83.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.escde.net/sascha/services/trackbacks/83.aspx</trackback:ping>
        </item>
        <item>
            <title>Color-Objekt aus einem hexadezimalen Farbcode erzeugen</title>
            <link>http://blogs.escde.net/sascha/archive/2007/07/02/81.aspx</link>
            <description>&lt;p&gt;Um ein System.Drawing.Color-Objekt aus einem String mit einem hexadezimalen Farbcode zu erzeugen, muss man den System.Web.UI.WebControls.WebColorConverter verwenden. Ein direktes Erzeugen mit Hilfe des HexCodes im Konstruktor einer neuen Color-Instanz ist nicht möglich.&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;string&lt;/span&gt; hexColor = &lt;span class="str"&gt;"#FF8080"&lt;/span&gt;;
System.Web.UI.WebControls.WebColorConverter converter = 
    &lt;span class="kwrd"&gt;new&lt;/span&gt; WebColorConverter();
System.Drawing.Color color = 
    (System.Drawing.Color)converter.ConvertFrom(hexColor);
e.Cell.BackColor = color;&lt;/pre&gt;
&lt;p&gt; &lt;/p&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
]]&gt;&lt;/style&gt;&lt;img src="http://blogs.escde.net/sascha/aggbug/81.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Sascha</dc:creator>
            <guid>http://blogs.escde.net/sascha/archive/2007/07/02/81.aspx</guid>
            <pubDate>Mon, 02 Jul 2007 15:34:38 GMT</pubDate>
            <comments>http://blogs.escde.net/sascha/archive/2007/07/02/81.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.escde.net/sascha/comments/commentRss/81.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.escde.net/sascha/services/trackbacks/81.aspx</trackback:ping>
        </item>
        <item>
            <title>In Visual Studio 2005 f&amp;uuml;r das .Net Framework 1.1 entwickeln</title>
            <link>http://blogs.escde.net/sascha/archive/2007/05/09/77.aspx</link>
            <description>&lt;p&gt;Wer mit Visual Studio 2003 gearbeitet hat und die Vorzüge des Entwickelns unter Visual Studio 2005 einmal kennen gelernt hat, möchte eigentlich nicht mehr zurück. Trotzdem gibt es immer noch Projekte, die auf dem .Net Framework 1.1 laufen müssen. Ein Powertoy für Visual Studio 2005 hilft aus diesem Dilemma: &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=e0d0776f-25c4-444a-a6b9-71d06826f5b4&amp;amp;displaylang=en" target="_blank"&gt;MSBee&lt;/a&gt;. MSBee ist eine Erweiterung für MSBuild und steht für MSBuild Everett Environment. Everett war der Codename für das .NET Framework 1.1. Mit MSBee kann der Entwickler in Visual Studio 2005 entwickeln und das Projekt dann mit dem .Net Framework 1.1 kompilieren. Das funktioniert soweit auch ganz gut, solange man Codebibliotheken entwickelt. Für Windows Forms oder Asp.Net Seiten können die Visual Studio 2005 Designer nicht verwendet werden, weil diese die Steuerelemente für .Net 2.0 verwenden. Alle anderen Namensräume von .Net 2.0 können natürlich ebenfalls nicht verwendet werden, genauso wie z.B. partielle Klassen oder Generics, die ebenfalls unter .Net 1.1 noch nicht zur Verfügung standen. Auch die Intellisense von Visual Studio 2005 und die Hilfe passen sich nicht an .Net 1.1 an.  &lt;/p&gt; &lt;p&gt;Installationsvoraussetzungen für MSBee:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;.Net Framework 2.0 (sollte wegen VS 2005 schon vorhanden sein)  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=262D25E3-F589-4842-8157-034D1E7CF3A3&amp;amp;displaylang=en" target="_blank"&gt;.Net Framework 1.1 Redistributable&lt;/a&gt; (Runtime) [2]  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=9B3A2CA6-3647-4070-9F41-A333C6B9181D&amp;amp;displaylang=en" target="_blank"&gt;.Net Framework 1.1 SDK&lt;/a&gt; [3]&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Um nach der Installation nun ein Projekt in Visual Studio 2005 zum Kompilieren mit dem .Net Framework 1.1 zu konfigurieren, müssen zunächst die MSBee .target Dateien in das Projekt geladen werden. Dazu sind folgende Schritte notwendig:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Das Projekt wie gewohnt erstellen, speichern und wieder schließen.   &lt;/li&gt;&lt;li&gt;Anschließend die Projektdatei (.csproj / .vbproj) in Notepad öffnen.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Bei einem C# Projekt: &lt;/p&gt; &lt;ul&gt; &lt;li&gt;folgende Zeile kurz vor Dateiende in der .csproj-Datei suchen: &lt;br /&gt;&amp;lt;Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /&amp;gt;  &lt;/li&gt;&lt;li&gt;Unmittelbar unter dieser Zeile muss folgende Zeile eingefügt werden: &lt;br /&gt;&amp;lt;Import Project="$(MSBuildExtensionsPath)\MSBee\MSBuildExtras.FX1_1.CSharp.targets" /&amp;gt; &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Bei einem Visual Basic Projekt:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;folgende Zeile kurz vor Dateiende der .vbproj-Datei suchen: &lt;br /&gt;&amp;lt;Import Project="$(MSBuildBinPath)\Microsoft.VisualBasic.targets" /&amp;gt; &lt;/li&gt;&lt;li&gt;Unmittelbar unter dieser Zeile muss folgende Zeile eingefügt werden: &lt;br /&gt;&amp;lt;Import Project="$(MSBuildExtensionsPath)\MSBee\MSBuildExtras.FX1_1.VisualBasic.targets" /&amp;gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Wenn das Projekt in Visual Studio wieder geöffnet ist, müssen in den Buildeinstellungen der Projekteigenschaften die &lt;em&gt;Conditional compilation symbols&lt;/em&gt; den Wert &lt;em&gt;FX1_1&lt;/em&gt; besitzen.&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.escde.net/images/blogs_escde_net/sascha/WindowsLiveWriter/InVisualStudio2005frdas.NetF.1entwickeln_B43C/image%7B0%7D%5B10%5D.png" target="_new" atomicselection="true"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="112" src="http://blogs.escde.net/images/blogs_escde_net/sascha/WindowsLiveWriter/InVisualStudio2005frdas.NetF.1entwickeln_B43C/image%7B0%7D_thumb%5B5%5D.png" width="500" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Nun kann das Projekt kompiliert werden. Dabei wird die .Net Framework Version 1.1 verwendet. &lt;/p&gt; &lt;p&gt;Das Ergebnis kann man überprüfen, indem man die erzeugte DLL mit dem Microsoft .Net Framework IL-Disassembler öffnet (Start / All Programs / Microsoft .NET Framework SDK v2.0 / SDK Command Prompt / Ildasm)&lt;/p&gt; &lt;p&gt;Dort sieht man im Manifest der dll-Datei die Framework-Version, mit der die Datei kompiliert wurde.&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.escde.net/images/blogs_escde_net/sascha/WindowsLiveWriter/InVisualStudio2005frdas.NetF.1entwickeln_B43C/image%7B0%7D%5B13%5D.png" target="_new" atomicselection="true"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="218" src="http://blogs.escde.net/images/blogs_escde_net/sascha/WindowsLiveWriter/InVisualStudio2005frdas.NetF.1entwickeln_B43C/image%7B0%7D_thumb%5B7%5D.png" width="320" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;[1]  MSBee, &amp;lt; 1 MB, &lt;a title="http://www.microsoft.com/downloads/details.aspx?FamilyID=e0d0776f-25c4-444a-a6b9-71d06826f5b4&amp;amp;displaylang=en" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=e0d0776f-25c4-444a-a6b9-71d06826f5b4&amp;amp;displaylang=en" target="_blank"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=e0d0776f-25c4-444a-a6b9-71d06826f5b4&amp;amp;displaylang=en&lt;/a&gt;&lt;br /&gt;[2] .Net Framework 1.1 Redistributable (Runtime), 24 MB, &lt;a title="http://www.microsoft.com/downloads/details.aspx?familyid=262D25E3-F589-4842-8157-034D1E7CF3A3&amp;amp;displaylang=en" href="http://www.microsoft.com/downloads/details.aspx?familyid=262D25E3-F589-4842-8157-034D1E7CF3A3&amp;amp;displaylang=en" target="_blank"&gt;http://www.microsoft.com/downloads/details.aspx?familyid=262D25E3-F589-4842-8157-034D1E7CF3A3&amp;amp;displaylang=en&lt;/a&gt;&lt;br /&gt;[3] .Net Framework 1.1 SDK, 106 MB, &lt;a title="http://www.microsoft.com/downloads/details.aspx?familyid=9B3A2CA6-3647-4070-9F41-A333C6B9181D&amp;amp;displaylang=en" href="http://www.microsoft.com/downloads/details.aspx?familyid=9B3A2CA6-3647-4070-9F41-A333C6B9181D&amp;amp;displaylang=en" target="_blank"&gt;http://www.microsoft.com/downloads/details.aspx?familyid=9B3A2CA6-3647-4070-9F41-A333C6B9181D&amp;amp;displaylang=en&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.escde.net/sascha/aggbug/77.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Sascha</dc:creator>
            <guid>http://blogs.escde.net/sascha/archive/2007/05/09/77.aspx</guid>
            <pubDate>Wed, 09 May 2007 12:42:51 GMT</pubDate>
            <comments>http://blogs.escde.net/sascha/archive/2007/05/09/77.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blogs.escde.net/sascha/comments/commentRss/77.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.escde.net/sascha/services/trackbacks/77.aspx</trackback:ping>
        </item>
        <item>
            <title>MemoryStreams verwenden</title>
            <link>http://blogs.escde.net/sascha/archive/2007/03/03/68.aspx</link>
            <description>&lt;p&gt;&lt;/p&gt; &lt;p&gt;Die MemoryStream-Klasse erstellt Streams, die im Arbeitsspeicher gesichert werden statt zum Beispiel im Dateisystem, wie das bei FileStreams der Fall ist. Eine Anwendung, die bisher viel mit temporären Dateien im Filesystem arbeitet, kann u. U. eine Menge Performance gewinnen, indem sie stattdessen MemoryStreams verwendet. Viele Komponenten, wie z. B. das RichTextBox-Steuerelement, akzeptieren nämlich in ihren Load() und Save() Methoden nicht nur einen Dateinamen, sondern wahlweise auch eine Stream-Instanz. Und hier kann statt einem FileStream auch ein MemoryStream übergeben werden. Das Beispiel hier zeigt die Verwendung eines MemoryStreams mit einem RichTextBox-Steuerelement. &lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:90e0f4b9-e4b6-4117-82d0-0b3ed05d76bc" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #008080; "&gt; 1&lt;/span&gt; &lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; _rtf &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;@"&lt;/span&gt;&lt;span style="color: #000000; "&gt;{\rtf1\ansi\ansicpg1252\deff0\deflang1031{&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;+&lt;/span&gt;&lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 2&lt;/span&gt; &lt;span style="color: #000000; "&gt;    &lt;/span&gt;&lt;span style="color: #000000; "&gt;@"&lt;/span&gt;&lt;span style="color: #000000; "&gt;\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;+&lt;/span&gt;&lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 3&lt;/span&gt; &lt;span style="color: #000000; "&gt;    &lt;/span&gt;&lt;span style="color: #000000; "&gt;@"&lt;/span&gt;&lt;span style="color: #000000; "&gt;}}\viewkind4\uc1\pard\f0\fs17 Hallo Stream\par}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;;
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 4&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 5&lt;/span&gt; &lt;span style="color: #000000; "&gt;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; *** RTF-Datei aus Speicher laden ***
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 6&lt;/span&gt; &lt;span style="color: #008000; "&gt;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; Stream-Objekt als MemoryStream-Objekt erstellen
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 7&lt;/span&gt; &lt;span style="color: #008000; "&gt;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; Byte-Array Darstellung von String im Konstruktor übergeben&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 8&lt;/span&gt; &lt;span style="color: #008000; "&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;Stream s &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; MemoryStream(UTF8Encoding.Default.GetBytes(_rtf));
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 9&lt;/span&gt; &lt;span style="color: #000000; "&gt;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;Stream an LoadFile() Methode übergeben&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt;10&lt;/span&gt; &lt;span style="color: #008000; "&gt;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.richTextBox1.LoadFile(s, RichTextBoxStreamType.RichText);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;11&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt;12&lt;/span&gt; &lt;span style="color: #000000; "&gt;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; *** RTF-Datei in Speicher sichern ***&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt;13&lt;/span&gt; &lt;span style="color: #008000; "&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;s &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; MemoryStream();
&lt;/span&gt;&lt;span style="color: #008080; "&gt;14&lt;/span&gt; &lt;span style="color: #000000; "&gt;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; Stream an SaveFile() Methode übergeben&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt;15&lt;/span&gt; &lt;span style="color: #008000; "&gt;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.richTextBox1.SaveFile(s, RichTextBoxStreamType.RichText);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;16&lt;/span&gt; &lt;span style="color: #000000; "&gt;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; Stream in MemoryStream casten, damit ToArray() Methode
&lt;/span&gt;&lt;span style="color: #008080; "&gt;17&lt;/span&gt; &lt;span style="color: #008000; "&gt;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; aufgerufen werden kann&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt;18&lt;/span&gt; &lt;span style="color: #008000; "&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;MemoryStream m &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; (MemoryStream)s;
&lt;/span&gt;&lt;span style="color: #008080; "&gt;19&lt;/span&gt; &lt;span style="color: #000000; "&gt;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;byte&lt;/span&gt;&lt;span style="color: #000000; "&gt;[] b &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; m.ToArray();
&lt;/span&gt;&lt;span style="color: #008080; "&gt;20&lt;/span&gt; &lt;span style="color: #000000; "&gt;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; Byte-Array in String zurückkonvertieren&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt;21&lt;/span&gt; &lt;span style="color: #008000; "&gt;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; t &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; UTF8Encoding.Default.GetString(b);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;22&lt;/span&gt; &lt;span style="color: #000000; "&gt;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;ASCIIEncoding.Default.GetString&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt;23&lt;/span&gt; &lt;span style="color: #008000; "&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;m.Dispose();
&lt;/span&gt;&lt;span style="color: #008080; "&gt;24&lt;/span&gt; &lt;span style="color: #000000; "&gt;s.Dispose();&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Beim Umwandeln von/ in Byte-Arrays helfen die statischen Methoden der jeweiligen Encoder-Klasse. Um ein ASCII-codiertes Byte-Array zu erstellen, hätte in Zeile 8 die Methode ASCIIEncoding.Default.GetBytes() aufgerufen werden müssen.&lt;/p&gt;&lt;img src="http://blogs.escde.net/sascha/aggbug/68.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Sascha</dc:creator>
            <guid>http://blogs.escde.net/sascha/archive/2007/03/03/68.aspx</guid>
            <pubDate>Sat, 03 Mar 2007 13:31:01 GMT</pubDate>
            <comments>http://blogs.escde.net/sascha/archive/2007/03/03/68.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.escde.net/sascha/comments/commentRss/68.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.escde.net/sascha/services/trackbacks/68.aspx</trackback:ping>
        </item>
        <item>
            <title>Custom Generic Collections oder: Filtern und Sortieren Teil 2</title>
            <link>http://blogs.escde.net/sascha/archive/2007/03/01/66.aspx</link>
            <description>&lt;p&gt;Im letzten Post hatte ich eine List&amp;lt;T&amp;gt; mit Hilfe von IComparer&amp;lt;T&amp;gt; und Predicate&amp;lt;T&amp;gt; sortiert bzw. gefiltert. Das hatte so weit auch funktioniert. Das einzige, was mir an dieser Lösung noch nicht gefällt: Wenn ich mich dafür entscheiden sollte, meine MP3-Dateien jetzt nach einem Artist statt nach einem Titel zu filtern, muss ich zuerst eine entsprechende Funktion dazu erstellen, dann das Prädikat erzeugen, was auf diese Funktion zeigt, und dieses dann beim Aufruf der FindAll-Methode verwenden. Das gleiche beim Sortieren. Der vorhandene Mp3Comparer sortiert nur nach Artist. Neue Sortierung, neuer Comparer. Das muss doch einfacher gehen...&lt;/p&gt; &lt;p&gt;Die Lösung bietet Reflection. Zumindest in meinem Fall. Reflection ist Gift für die Performance, so dass man bei großen Listen evtl. ein Problem mit den Laufzeiten der Sort-Methode bekommt, wenn bei der Erstellung der Sortierordnung jedes Listenelement mehrfach mittels Reflection untersucht werden muss. &lt;/p&gt; &lt;p&gt;An den Comparer wird der Name der Eigenschaft übergeben, in der Compare-Methode wird die Eigenschaft und deren Werte per Reflection aus den zu vergleichenden Elementen ermittelt und das Ergebnis des Vergleichs zurückgeliefert.  &lt;/p&gt; &lt;p&gt;Der bisherige MP3Comparer ist speziell auf den Vergleich von Instanzen des Typs ID3Tag ausgelegt, da er auf die Eigenschaften Titel und Artist angewiesen ist. Daher war er auch vom Typ IComparer&amp;lt;ID3Tag&amp;gt;. Der neue Comparer, den ich ReflectionComparer getauft habe, ist hingegen für alle Typen geeignet, daher vom Typ IComparer&amp;lt;T&amp;gt;. Der Comparer funktioniert aber nur, wenn der Typ der Eigenschaften, deren Werte verglichen werden sollen, selbst das IComparable Interface implementiert. Für die Standarddatentypen wie String, Int32, etc. ist dies erfüllt.&lt;/p&gt; &lt;p&gt;Der komplette Code für den neuen Comparer sieht nun folgendermaßen aus: &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:6cab7ae5-25da-44b3-8508-c0d40700f0fe" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;class&lt;/span&gt;&lt;span style="color: #000000; "&gt; ReflectionComparer&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;T&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; : IComparer&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;T&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;
{
    SortType sortType;
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; sortPropertyName;

    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; ReflectionComparer(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; sortPropertyName)
    {
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.sortPropertyName &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; sortPropertyName;
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.sortType &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; SortType.Ascending;
    }

    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; ReflectionComparer(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; sortPropertyName,
        SortType sortType)
    {
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.sortPropertyName &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; sortPropertyName;
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.sortType &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; sortType;
    }

    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;#region&lt;/span&gt;&lt;span style="color: #000000; "&gt; IComparer&amp;lt;T&amp;gt; Members&lt;/span&gt;&lt;span style="color: #000000; "&gt;
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; Compare(T x, T y)
    {
        &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; Mittels Reflection die Werte 
        &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;der Eigenschaften aus x und y bestimmen&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;object&lt;/span&gt;&lt;span style="color: #000000; "&gt; valueX &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; x.GetType().GetProperty(
            sortPropertyName).GetValue(x, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;null&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;object&lt;/span&gt;&lt;span style="color: #000000; "&gt; valueY &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; y.GetType().GetProperty(
            sortPropertyName).GetValue(y, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;null&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
        
        &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; Der Typ der Eigenschaft muss IComparable implementieren&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;        IComparable comparable &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; (IComparable)valueX;
        &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; Wert x mit Wert y vergleichen&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt; (&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt;)sortType &lt;/span&gt;&lt;span style="color: #000000; "&gt;*&lt;/span&gt;&lt;span style="color: #000000; "&gt; comparable.CompareTo(valueY);
    }
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;#endregion&lt;/span&gt;&lt;span style="color: #000000; "&gt;
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Auf sämtliche Fehlerbehandlung wurde in diesen Beispielen verzichtet. Gerade bei Reflection ist das aber wichtig, weil der Kompiler keinen Fehler meldet, wenn wir nach einem Feld sortieren wollen, das es gar nicht gibt. In der Form kann ich den IComparer wie gehabt an die Sort-Methode von List&amp;lt;T&amp;gt; anhängen. Ich möchte den Aufruf jedoch etwas intuitiver kapseln, so dass ich die Liste mit&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:7af871f4-3768-40ac-b8dd-7cd9f0d4cc5e" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #000000; "&gt;id3Tags.Sort(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Artist&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, SortType.Ascending);
id3Tags.Sort(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Album&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, SortType.Descending);&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;entsprechend sortieren kann. Das heißt, ich muss eine eigene Generic Collection erzeugen. Es wäre jetzt naheliegend, diese CustomGenericCollection von System.Collections.Generic.List abzuleiten. Dies sollte man nach den Empfehlungen von Microsoft jedoch nicht tun, da List&amp;lt;T&amp;gt; eine große Anzahl von öffentlichen Methoden und Eigenschaften besitzt, die in den meisten Szenarien nicht relevant sind. Das heißt nicht, dass man nicht von List&amp;lt;T&amp;gt; erben könnte. Wenn man z.B. nur eine weitere Methode hinzufügen möchte, dann kann es schon Gründe geben, es auf diesem Weg machen. Es ist aber nicht möglich, sich in die Eventkette der Liste einzuklinken. Muss z.B. beim Löschen eines Elements aus der Liste ein Logeintrag erstellt werden, ist List&amp;lt;T&amp;gt; als Basisklasse nicht zu verwenden. Überhaupt bietet List&amp;lt;T&amp;gt; keine überschreibbaren Member, was auch ein Zeichen dafür ist, dass diese Klasse nicht zum vererben gemacht wurde. Auch sollten keine List&amp;lt;T&amp;gt; Objekte als Eigenschaften von Klassen nach außen gegeben werden. &lt;/p&gt;
&lt;p&gt;FXCop meldet einen DoNotExposeGenericLists Fehler mit dem Hinweis: "System.Collections.Generic.List&amp;lt;T&amp;gt; is a generic collection designed for&lt;br /&gt;performance not inheritance and, therefore, does not contain any virtual members. The following generic collections are designed for inheritance and&lt;br /&gt;should be exposed instead of System.Collections.Generic.List&amp;lt;T&amp;gt;. &lt;br /&gt;* System.Collections.ObjectModel.Collection&amp;lt;T&amp;gt;&lt;br /&gt;* System.Collections.ObjectModel.ReadOnlyCollection&amp;lt;T&amp;gt;&lt;br /&gt;* System.Collections.ObjectModel.KeyedCollection&amp;lt;TKey, TItem&amp;gt;"&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/kcwalina/default.aspx" target="_blank"&gt;Krzysztof Cwalina&lt;/a&gt; (Program Manager .Net Framework team at MS)  hat in einem Blogpost &lt;a href="http://blogs.msdn.com/kcwalina/archive/2005/09/23/Collections.aspx" target="_blank"&gt;"System.Collections vs. System.Collection.Generic and System.Collections.ObjectModel"&lt;/a&gt; die verschiedenen Collection-Klassen und -Interfaces in den verschiedenen Namespaces in einer Übersicht zusammengestellt. Auch sehr hilfreich war ein Auszug des Wrox Buches "&lt;a href="http://www.wrox.com/WileyCDA/Section/id-290685.html" target="_blank"&gt;Professional C# 2005&lt;/a&gt;"&lt;/p&gt;
&lt;p&gt;Anders die Klasse Collection&amp;lt;T&amp;gt;, die in der MSDN als "base class for a generic collection" beschrieben wird. Diese gehört aber nicht zum Namensraum System.Collections.Generic, sondern findet sich in System.Collections.ObjectModel. Grund dafür ist eine gleichnamige, nichtgenerische Collection Klasse aus dem Microsoft.VisualBasic Namensraum, der bei Visual Basic Klassen, ebenso wie System.Collections.Generic, standardmäßig importiert wird und es dadurch zu Namenskonflikten kommen kann. &lt;br /&gt;Nach aussen sind bei der Collection&amp;lt;T&amp;gt; Klasse nur die nötigsten Eigenschaften und Methoden verfügbar und intern kann die innere Liste über die Items-Eigenschaft abgegriffen werden. Zudem bietet Collection&amp;lt;T&amp;gt; überschreibbare Methoden zur Benachrichtigung bei Änderungen an der Liste, d.h. bei Hinzufügen, Aktualisieren und Löschen von Elementen. Das hört sich doch gut an, eine CustomGenericCollection ist dann schnell erstellt. &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:e877f9f4-b4d1-4358-a6ae-f56a20486426" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;class&lt;/span&gt;&lt;span style="color: #000000; "&gt; CustomGenericCollection&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;T&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; : System.Collections.ObjectModel.Collection&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;T&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;
    {
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;protected&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;override&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; InsertItem(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; index, T item)
        {
            &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; Aktion, wenn Item hinzugefügt wird&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;base&lt;/span&gt;&lt;span style="color: #000000; "&gt;.InsertItem(index, item);
        }
        
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; T[] ToArray()
        {
            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt; ((List&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;T&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;base&lt;/span&gt;&lt;span style="color: #000000; "&gt;.Items).ToArray();
        }

        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; Sort(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; sortPropertyName)
        {
            Sort(sortPropertyName, SortType.Ascending);
        }
        
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; Sort(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; sortPropertyName, SortType sortType)
        {
            ReflectionComparer&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;T&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; comparison &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; 
                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; ReflectionComparer&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;T&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;(sortPropertyName, sortType);
            ((List&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;T&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;base&lt;/span&gt;&lt;span style="color: #000000; "&gt;.Items).Sort(comparison);
        }
    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Neben den zwei Sort-Methoden, die die innere Liste mit dem ReflectionComparer von oben aufrufen, wird zusätzlich noch die ToArray-Methode der inneren Liste nach außen geführt, die in Collection&amp;lt;T&amp;gt; der Schlankheit zuliebe eingespart wurde. In der Insert-Methode könnte man das Hinzufügen eines neuen Elements zur Liste protokollieren oder auch unterbinden.&lt;/p&gt;
&lt;p&gt;Die Filterung sollte auch noch etwas einfacher vonstatten gehen. Das Vorgehen ist wieder ähnlich. Die bisherige Filtermethode, die mittels Prädikat an die FindAll-Methode der List&amp;lt;T&amp;gt; übergeben wurde, wollte ein Objekt vom Typ ID3Tag übergeben bekommen. Da der neue GenericFilter ebenfalls mit Reflection arbeitet, ist der Typ der generischen Filtermethode egal. Wenn eine Instanz von GenericFilter erzeugt wird, muss ihr im Konstruktor der Name der zu filternden Eigenschaft, der Vergleichswert sowie optional ein Operator mitgegeben werden. Der Code der Klasse GenericFilter sieht dann so aus:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:14e4dc13-1442-461a-ae28-a5ca5ffdbac9" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;internal&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;class&lt;/span&gt;&lt;span style="color: #000000; "&gt; GenericFilter
{
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; filterPropertyName &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;""&lt;/span&gt;&lt;span style="color: #000000; "&gt;;
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; filterValue &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;""&lt;/span&gt;&lt;span style="color: #000000; "&gt;;
    FilterOperator filterOperator;

    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; GenericFilter(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; filterPropertyName, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; filterValue)
    {
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.filterPropertyName &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; filterPropertyName;
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.filterValue &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; filterValue;
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.filterOperator &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; FilterOperator.Contains;
    }

    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; GenericFilter(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; filterPropertyName, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; filterValue, 
        FilterOperator filterOperator)
    {
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.filterPropertyName &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; filterPropertyName;
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.filterValue &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; filterValue;
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.filterOperator &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; filterOperator;
    }

    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;bool&lt;/span&gt;&lt;span style="color: #000000; "&gt; Filter&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;T&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;(T x)
    {
        &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; Mittels Reflection die Werte 
        &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; der Eigenschaften aus x und y bestimmen&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;object&lt;/span&gt;&lt;span style="color: #000000; "&gt; valueX &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; x.GetType().GetProperty(
            filterPropertyName).GetValue(x, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;null&lt;/span&gt;&lt;span style="color: #000000; "&gt;);

        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;switch&lt;/span&gt;&lt;span style="color: #000000; "&gt; (filterOperator)
        {
            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;case&lt;/span&gt;&lt;span style="color: #000000; "&gt; FilterOperator.Contains:
                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;if&lt;/span&gt;&lt;span style="color: #000000; "&gt; (Convert.ToString(valueX).Contains(filterValue))
                    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;true&lt;/span&gt;&lt;span style="color: #000000; "&gt;;
                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;break&lt;/span&gt;&lt;span style="color: #000000; "&gt;;
            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;case&lt;/span&gt;&lt;span style="color: #000000; "&gt; FilterOperator.Equals:
                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;if&lt;/span&gt;&lt;span style="color: #000000; "&gt; (Convert.ToString(valueX).Equals(filterValue))
                    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;true&lt;/span&gt;&lt;span style="color: #000000; "&gt;;
                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;break&lt;/span&gt;&lt;span style="color: #000000; "&gt;;
            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;case&lt;/span&gt;&lt;span style="color: #000000; "&gt; FilterOperator.GreaterThan:
                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;if&lt;/span&gt;&lt;span style="color: #000000; "&gt; (Convert.ToInt32(valueX).CompareTo(Convert.ToInt32(filterValue)) &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;)
                    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;true&lt;/span&gt;&lt;span style="color: #000000; "&gt;;
                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;break&lt;/span&gt;&lt;span style="color: #000000; "&gt;;
            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;case&lt;/span&gt;&lt;span style="color: #000000; "&gt; FilterOperator.LessThan:
                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;if&lt;/span&gt;&lt;span style="color: #000000; "&gt; (Convert.ToInt32(valueX).CompareTo(Convert.ToInt32(filterValue)) &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;)
                    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;true&lt;/span&gt;&lt;span style="color: #000000; "&gt;;
                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;break&lt;/span&gt;&lt;span style="color: #000000; "&gt;;
            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;default&lt;/span&gt;&lt;span style="color: #000000; "&gt;:
                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;false&lt;/span&gt;&lt;span style="color: #000000; "&gt;;
        }
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;false&lt;/span&gt;&lt;span style="color: #000000; "&gt;;
    }
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Der Filter kann für Texteigenschaften die Operatoren Contains und Equals anwenden und für ganzzahlige Eigenschaften einen GreaterThan oder LessThan Vergleich anstellen. Auch hier wieder eine ziemlich laxe Fehlerbehandlung ;-) &lt;/p&gt;
&lt;p&gt;Wie dem auch sei, jetzt muss nur noch die FindAll-Methode meiner CustomGenericCollection das Prädikat mit dem Verweis auf die neue Filter-Funktion erstellen und das dann an die FindAll-Methode der inneren Liste weiterreichen. Als Ergebnis wird ein Array vom Typ T nach außen gegeben.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:25ffd844-8498-43a2-95d6-480a98760186" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; T[] FindAll(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; filterPropertyName, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; filterValue, FilterOperator filterOperator)
{
    GenericFilter genericFilter &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; GenericFilter(filterPropertyName, filterValue, filterOperator);

    &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; Prädikat vorbereiten&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;    Predicate&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;T&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; filterGeneric &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; Predicate&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;T&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;(genericFilter.Filter&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;T&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
    &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; Filtern und als Array zurückgeben&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt; ((List&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;T&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;base&lt;/span&gt;&lt;span style="color: #000000; "&gt;.Items).FindAll(filterGeneric).ToArray();
}

&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; T[] FindAll(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; filterPropertyName, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; filterValue)
{
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt; FindAll(filterPropertyName, filterValue, FilterOperator.Contains);
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Die Liste von ID3Tags muss noch auf den neuen Typ CustomGenericCollection umgestellt werden.&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:1f993d8a-c13e-4f7a-870f-8e5b1ddc1027" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;List&amp;lt;ID3Tag&amp;gt; id3Tags = new List&amp;lt;ID3Tag&amp;gt;();&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;CustomGenericCollection&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;ID3Tag&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; id3Tags &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; CustomGenericCollection&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;ID3Tag&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Nun lässt sie sich anständig filtern:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:560f1b4e-922d-42ab-8fed-a81a7ae0ecc1" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #000000; "&gt;ID3Tag[] filteredItemsArray;
filteredItemsArray &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; 
    id3Tags.FindAll(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Year&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;1990&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, FilterOperator.GreaterThan);
filteredItemsArray &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt;
    id3Tags.FindAll(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Title&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Love&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, FilterOperator.Contains);&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Ich hätte die neuen Filter- und Sortiermethoden nicht unbedingt generisch halten müssen. Nimmt man den geringen Mehraufwand in Kauf, wird man mit hoher Wiederverwendbarkeit belohnt, wie der folgende und letzte Codefetzen zeigt. Was er tut, erahnen Sie sicherlich. &lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:aad27be3-dc7c-4ad3-8193-e346ba068b12" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;class&lt;/span&gt;&lt;span style="color: #000000; "&gt; Person
{
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; nachname;
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; vorname;

    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; Person(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; nachname, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; vorname)
    {
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.nachname &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; nachname;
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.vorname &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; vorname;
    }

    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; Nachname
    {
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;get&lt;/span&gt;&lt;span style="color: #000000; "&gt; { &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt; nachname; }
    }
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; Vorname
    {
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;get&lt;/span&gt;&lt;span style="color: #000000; "&gt; { &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt; vorname; }
    }

    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;override&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; ToString()
    {
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt; String.Format(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;{0}, {1}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, nachname, vorname);
    }
}

...

CustomGenericCollection&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;Person&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; persColl &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; 
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; CustomGenericCollection&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;Person&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;();
persColl.Add(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; Person(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Frietsch&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Sascha&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;));
persColl.Add(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; Person(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Schimmel&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Jochen&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;));
persColl.Add(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; Person(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Janczik&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Sebastian&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;));

persColl.Sort(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Nachname&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, SortType.Descending);
Person[] persArray &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; persColl.ToArray();

persArray &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; persColl.FindAll(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Vorname&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Sascha&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, FilterOperator.Equals);&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;img src="http://blogs.escde.net/sascha/aggbug/66.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Sascha</dc:creator>
            <guid>http://blogs.escde.net/sascha/archive/2007/03/01/66.aspx</guid>
            <pubDate>Thu, 01 Mar 2007 17:58:23 GMT</pubDate>
            <comments>http://blogs.escde.net/sascha/archive/2007/03/01/66.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.escde.net/sascha/comments/commentRss/66.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.escde.net/sascha/services/trackbacks/66.aspx</trackback:ping>
        </item>
        <item>
            <title>Filtern von generischen Listen mit Hilfe von Pr&amp;auml;dikaten</title>
            <link>http://blogs.escde.net/sascha/archive/2007/03/01/65.aspx</link>
            <description>&lt;p&gt;Nachdem ich meine Liste von ID3Tags jetzt sortieren kann, fehlt noch das Filtern einer generischen Liste. &lt;/p&gt; &lt;p&gt;Die Typen System.Collections.Generic.List und System.Array stellen eine Reihe von Methoden zur Verfügung, die einen einzigen Parameter vom Typ Predicate&amp;lt;T&amp;gt; erwarten. &lt;/p&gt; &lt;ul&gt; &lt;li&gt;Exists&lt;/li&gt; &lt;li&gt;Find&lt;/li&gt; &lt;li&gt;FindAll&lt;/li&gt; &lt;li&gt;FindIndex&lt;/li&gt; &lt;li&gt;FindLast&lt;/li&gt; &lt;li&gt;FindLastIndex&lt;/li&gt; &lt;li&gt;ForEach&lt;/li&gt; &lt;li&gt;RemoveAll&lt;/li&gt; &lt;li&gt;TrueForAll &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Für meinen Filter will ich die FindAll Methode verwenden, die als Ergebnis eine List&amp;lt;T&amp;gt; liefert, welche nur die Elemente der Ursprungsliste enthält, die das übergebene Prädikat erfüllen. &lt;/p&gt; &lt;p&gt;Prädikate sind eines der neuen generischen Features, die seit Version 2.0 des .Net Frameworks zur Verfügung stehen. Der Delegat System.Predicate wird wie folgt definiert:&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:84a8982e-e9c9-401f-980a-bf438fa1f1a9" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #000000; "&gt;Public Delegate Function Predicate(Of T)(obj As T) As Boolean&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Eine Funktion, die als Prädikat fungieren soll, muss also einen einzigen Parameter akzeptieren, der vom gleichen Typ sein muss, wie die Elemente der Liste, die mit Hilfe dieses Prädikats bearbeitet werden soll. Der Rückgabewert ist ein Booleanwert,  der angibt, ob das untersuchte Element in die Ergebnismenge übernommen werden soll.&lt;/p&gt;
&lt;p&gt;Um alle Instanzen von ID3Tags zu bekommen, deren Titel das Wort "Happy" enthält, könnte man einen Code in dieser Form verwenden: &lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:7e95e251-e0cb-4d58-9335-fd1922d1bbba" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; compareValue &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Happy&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;;
List&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;ID3Tag&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; titleFilteredList &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; List&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;ID3Tag&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;(); 
&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;foreach&lt;/span&gt;&lt;span style="color: #000000; "&gt; (ID3Tag id3Tag &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;in&lt;/span&gt;&lt;span style="color: #000000; "&gt; id3Tags)
{
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;if&lt;/span&gt;&lt;span style="color: #000000; "&gt; (id3Tag.Title.Contains(compareValue))
    {
        titleFilteredList.Add(id3Tag);
    }
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Alle Elemente der Ausgangsliste werden durchlaufen; wenn der Titel den gesuchten Wert enthält, wird das Element der Ergebnismenge angefügt. Achtung: in diesem Beispiel wird nur eine Referenz auf das Element in die Ergebnisliste angefügt, keine Kopie!&lt;/p&gt;
&lt;p&gt;Die FindAll-Methode funktioniert vom Prinizip her genauso wie die Schleife im obigen Code. Das übergebene Prädikat entspricht der Überprüfung innerhalb der Schleife. Es bestimmt, was beim einzelnen Element geprüft werden soll. Zunächst muss also eine Funktion definiert werden, die ein Element vom Typ ID3Tag entgegennimmt und nach der Überprüfung des Elements einen booleschen Wert zurückgibt. Der Vergleichswert wird schon im Konstruktor der SearchFilter-Klasse übergeben.&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:d6354f62-eb5a-4052-b469-fe29eb1ebe5d" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;internal&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;class&lt;/span&gt;&lt;span style="color: #000000; "&gt; SearchFilter
    {
        &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; Vergleichswert&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;private&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; compareValue &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;""&lt;/span&gt;&lt;span style="color: #000000; "&gt;;

        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; SearchFilter(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; compareValue)
        {
            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.compareValue &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; compareValue;
        }

        &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; Suche nach Teil von Titel&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;bool&lt;/span&gt;&lt;span style="color: #000000; "&gt; TitleContains(ID3Tag id3Tag)
        {
            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt; id3Tag.Title.Contains(compareValue);
        }
    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Jetzt kann das Prädikat erzeugt und der FindAll()-Methode übergeben werden. Das Prädikat ist - als Delegat - lediglich die Adresse einer aufrufbaren Methode. &lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:83b6ce0b-5049-47be-91dc-a822510e45ab" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;Vergleichswert für Suche nach Titel im Konstruktor übergeben&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;SearchFilter titleSearchFilter &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; SearchFilter(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Happy&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; Prädikat vorbereiten&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;Predicate&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;ID3Tag&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; filterByTitle &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt;
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; Predicate&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;ID3Tag&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;(titleSearchFilter.TitleContains);
&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; Liste mit gefiltertem Ergebnis&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;List&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;ID3Tag&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; titleFilteredList &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; id3Tags.FindAll(filterByTitle);&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Die anderen Methoden, die ich oben erwähnt hatte und die ebenfalls ein Pedicate&amp;lt;T&amp;gt; als Parameter erwarten, funktionieren ähnlich. So iteriert Exists ebenfalls durch alle Elemente und gibt true zurück, wenn das Prädikat das erste mal für ein Element true zurückgibt. FindLastIndex durchläuft die Liste von hinten nach vorne und gibt den Index des Elements aus, bei dem das Prädikat das erste mal true zurückgibt, usw. Interessant sind auch die ForEach()- und RemoveAll()-Methoden.&lt;/p&gt;
&lt;p&gt;Mit Prädikaten spart man sich den Code, um durch Elemente einer Liste zu iterieren. OK, vielleicht nicht so triftig, dieser Grund. Aber bezüglich Wiederverwendbarkeit und Austauschbarkeit zur Laufzeit haben Prädikate ihren Charme.&lt;/p&gt;&lt;img src="http://blogs.escde.net/sascha/aggbug/65.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Sascha</dc:creator>
            <guid>http://blogs.escde.net/sascha/archive/2007/03/01/65.aspx</guid>
            <pubDate>Thu, 01 Mar 2007 11:21:16 GMT</pubDate>
            <comments>http://blogs.escde.net/sascha/archive/2007/03/01/65.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.escde.net/sascha/comments/commentRss/65.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.escde.net/sascha/services/trackbacks/65.aspx</trackback:ping>
        </item>
        <item>
            <title>Sortieren von generischen Listen</title>
            <link>http://blogs.escde.net/sascha/archive/2007/02/28/64.aspx</link>
            <description>&lt;p&gt;Ich war auf der Suche nach einem einigermaßen sinnvollen Beispiel für die Programmierung von Powershell Cmdlets. Das erste Cmdlet soll Informationen aus ID3Tags von MP3-Dateien auslesen. Man muss das Rad nicht jedesmal neu erfinden, daher verwende ich die Bibliothek ID3Sharp von Chris Woodbury, die man auf sourceforge.net finden kann.&lt;/p&gt; &lt;p&gt;Die MP3-Dateien aus einem Verzeichnis werden nacheinander eingelesen. Für jede Datei werden die Informationen aus dem ID3-Tag in einer Instanz vom Typ ID3Tag zurückgegeben. Diese besitzt lediglich einige öffentliche Eigenschaften für die gängigen Informationen wie Artist, Title, Album, etc. Diese einzelnen Instanzen von ID3Tags werden in einer generischen Liste gesammelt. &lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:0ca1138c-9251-4a78-8db8-fc84931ae768" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #000000; "&gt;List&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;ID3Tag&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt; id3Tags &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; List&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;ID3Tag&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Es wäre schön, auf diese Liste nun Filter und Sortierungen anzuwenden. Geht natürlich auch ;-)&lt;/p&gt;
&lt;p&gt;Fangen wir mit dem Sortieren an. Die generische Klasse List&amp;lt;T&amp;gt; bietet von Haus aus eine Sort() Methode in drei möglichen Überladungen.&lt;/p&gt;
&lt;p&gt;List&amp;lt;T&amp;gt;.Sort () ohne weitere Argumente verwendet den default comparer. Das bedeutet, dass der Typ T das IComparable- oder das generische IComparable-Interface implementieren muss. Da dies bei ID3Tag nicht der Fall ist, würde sich die Liste bei einem Sort()-Aufruf mit einer InvalidOperationException bedanken.&lt;/p&gt;
&lt;p&gt;Für die beiden anderen Überladungen wird eine Vergleichsmethode benötigt, die als Parameter zwei Variablen vom Typ T verarbeiten muss, in unserem Falle also zwei Objekte vom Typ ID3Tag. Der Rückgabewert der Methode ist -1, 0 oder 1, je nachdem, ob x kleiner, gleich, oder größer y ist. Ich überlasse hier die Berechnung des Rückgabewertes der String.CompareTo()-Methode der Artist- bzw. Title-Eigenschaft.&lt;/p&gt;
&lt;p&gt;Für die Sortierung List&amp;lt;T&amp;gt;.Sort (Generic Comparison) muss die Vergleichsmethode in einer statischen Methode mit den oben erwähnten Parameter definiert werden:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:0c8eecb3-5143-4467-b848-89111967aceb" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;static&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; CompareID3TagsByArtist(ID3Tag x, ID3Tag y)
{
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;if&lt;/span&gt;&lt;span style="color: #000000; "&gt; (x.Artist &lt;/span&gt;&lt;span style="color: #000000; "&gt;==&lt;/span&gt;&lt;span style="color: #000000; "&gt; y.Artist)
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt; x.Title.CompareTo(y.Title);
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;else&lt;/span&gt;&lt;span style="color: #000000; "&gt;
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt; x.Artist.CompareTo(y.Artist);
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Diese Methode habe ich in einer Klasse SearchFilter erstellt. Der Aufruf zum Sortieren der Liste lautet daher:&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:f3ab1803-b240-4c5f-9049-f7d9df887f79" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #000000; "&gt;id3Tags.Sort(SearchFilter.CompareID3TagsByArtist);&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Die letzte Möglichkeit, List&amp;lt;T&amp;gt;.Sort(Generic IComparer), verstaut die Vergleichsmethode in einer eigenen Klasse, die das generische IComparer&amp;lt;T&amp;gt;-Interface implementiert. Um das Interface zu implementieren, muss exakt eine Methode erstellt werden - die Vergleichsmethode. Die ganze Klasse sieht dann so aus:&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:7e47cbad-c85e-4f60-8677-04f24524830b" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;internal&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;class&lt;/span&gt;&lt;span style="color: #000000; "&gt; Mp3Comparer : IComparer&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;ID3Tag&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;
{
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;#region&lt;/span&gt;&lt;span style="color: #000000; "&gt; IComparer&amp;lt;ID3Tag&amp;gt; Members&lt;/span&gt;&lt;span style="color: #000000; "&gt;

    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; Compare(ID3Tag x, ID3Tag y)
    {
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;if&lt;/span&gt;&lt;span style="color: #000000; "&gt; (x.Artist &lt;/span&gt;&lt;span style="color: #000000; "&gt;==&lt;/span&gt;&lt;span style="color: #000000; "&gt; y.Artist)
            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt; x.Title.CompareTo(y.Title);
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;else&lt;/span&gt;&lt;span style="color: #000000; "&gt;
            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt; x.Artist.CompareTo(y.Artist);
    }
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;#endregion&lt;/span&gt;&lt;span style="color: #000000; "&gt;
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Für den Sortieraufruf muss dann ein Objekt vom Type Mp3Comparer erzeugt werden, welches an die Sortmethode übergeben wird.&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:35e11002-37e0-436b-a1aa-76f297db2d96" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #000000; "&gt;Mp3Comparer mc &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; Mp3Comparer();
id3Tags.Sort(mc);&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Als letztes Schmankerl fehlt noch ein aufsteigendes oder absteigendes Sortieren. Dafür lässt sich der Code für die Mp3Comparer Klasse zum Beispiel wie folgt ändern:&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:9db55453-df48-4d20-a887-ab662d858a9d" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;#region&lt;/span&gt;&lt;span style="color: #000000; "&gt; IComparer&amp;lt;ID3Tag&amp;gt; Members&lt;/span&gt;&lt;span style="color: #000000; "&gt;

&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; Compare(ID3Tag x, ID3Tag y)
{
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;if&lt;/span&gt;&lt;span style="color: #000000; "&gt; (x.Artist &lt;/span&gt;&lt;span style="color: #000000; "&gt;==&lt;/span&gt;&lt;span style="color: #000000; "&gt; y.Artist)
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt; (&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt;)sortType &lt;/span&gt;&lt;span style="color: #000000; "&gt;*&lt;/span&gt;&lt;span style="color: #000000; "&gt; x.Title.CompareTo(y.Title);
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;else&lt;/span&gt;&lt;span style="color: #000000; "&gt;
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt; (&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt;)sortType &lt;/span&gt;&lt;span style="color: #000000; "&gt;*&lt;/span&gt;&lt;span style="color: #000000; "&gt; x.Artist.CompareTo(y.Artist);
}

&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;#endregion&lt;/span&gt;&lt;span style="color: #000000; "&gt;

&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; Mp3Comparer()
{
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.sortType &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; SortType.Ascending;
}

&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; Mp3Comparer(SortType sortType)
{
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.sortType &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; sortType;
}

&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;private&lt;/span&gt;&lt;span style="color: #000000; "&gt; SortType sortType;
&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;enum&lt;/span&gt;&lt;span style="color: #000000; "&gt; SortType {Descending &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;-&lt;/span&gt;&lt;span style="color: #000000; "&gt;1&lt;/span&gt;&lt;span style="color: #000000; "&gt;, Ascending &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;1&lt;/span&gt;&lt;span style="color: #000000; "&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Es ist ein neuer Konstruktor hinzugekommen, der eine Sortierrichtung als Parameter akzeptiert. Ist ein Nicht-Standardkonstruktor definiert, muss auch der Standardkonstruktor explizit angegeben werden. Die bisherige Sortierrichtung war aufsteigend. Dies soll auch der Standardwert sein, wenn keine Richtung angegeben wurde. Soll absteigend sortiert werden, wird der Rückgabewert von Compare gerade mit -1 multipliziert.&lt;/p&gt;
&lt;p&gt;Um die Liste nun absteigend zu sortieren, wird folgender Aufruf verwendet:&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:63136683-35dc-439a-9061-46b2a9073d95" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #000000; "&gt;Mp3Comparer mc &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; Mp3Comparer(Mp3Comparer.SortType.Descending);
id3Tags.Sort(mc);
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;img src="http://blogs.escde.net/sascha/aggbug/64.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Sascha</dc:creator>
            <guid>http://blogs.escde.net/sascha/archive/2007/02/28/64.aspx</guid>
            <pubDate>Wed, 28 Feb 2007 18:08:01 GMT</pubDate>
            <comments>http://blogs.escde.net/sascha/archive/2007/02/28/64.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.escde.net/sascha/comments/commentRss/64.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.escde.net/sascha/services/trackbacks/64.aspx</trackback:ping>
        </item>
    </channel>
</rss>