Schlagwort: LINQ

PHP-Funktionen in C# (noch nicht) als Programmbibliothek 👍 👎

Meine beispielhaften PHP-Funktionen in C# erfreuen sich gewisser Beliebtheit, sodass mich mittlerweile schon ein paar mal die Frage erreicht hat, ob ich diese nicht als Programmbibliothek zur Verfügung stellen möchte.

Aus technischer Sicht wäre das tatsächlich kein Problem und grundsätzlich sogar mit überschaubarem Aufwand automatisierbar. Ich habe daher auch selbst schon einmal mit dem Gedanken der Veröffentlichung als Paket gespielt, dennoch möchte ich erst einmal Abstand davon nehmen und zwar vor allem aus folgenden Gründen:
  • Design

    Die Umsetzung der Methoden (Bezeichner, Datentypen, Parameter) ist stark an PHP angelehnt, sprich ist soweit möglich identisch zu den gleichnamigen PHP-Funktionen. Diese Umsetzung widerspricht jedoch in nahezu allen Fällen in vielerlei Hinsicht den .NET-Guidelines für Programmbibliotheken und auch die Datentypen entsprechen oftmals nicht den bei C# für den jeweiligen Einsatzzweck üblichen.

  • Qualität

    Die Umsetzungen sollen einen Ansatz bzw. Tipps liefern, entsprechen jedoch in einigen Fällen nicht einer Qualität, die einen sofortigen und ungeprüften Einsatz in Produktionsumgebungen ermöglicht. Dies wäre für eine tatsächliche Veröffentlichung jedoch zwingend erforderlich. Darüber hinaus wären an einigen Stellen Optimierungen für den effizienten Einsatz in echten Projekten durchaus sinnvoll.

Dennoch stimme ich natürlich grundsätzlich zu, dass die Implementierungen einige praktische Funktionen anbieten, die in PHP durchaus üblich sind, in C# standardmäßig jedoch nicht ohne Weiteres zur Verfügung stehen. Daher werde ich an einer entsprechenden Programmbibliothek arbeiten, die ausschließlich solche Funktionalität in stabiler Qualität zur Verfügung stellt. Einen konkreten Zeitplan kann und möchte ich derzeit jedoch noch nicht nennen.

XML-Dokument mit LINQ to XML verarbeiten 👍 👎

Obwohl andere Formate wie beispielsweise JSON immer mehr Verbreitung gewinnen, bleibt es natürlich nötig, XML verarbeiten zu können – mit diesem Beitrag möchte ich zeigen, wie XML-Dokumente mit LINQ to XML besonders einfach verarbeitet werden können. LINQ selbst werde ich separat noch ausführlich behandeln.

Als Ausgangslage für unser Beispiel soll folgendes XML-Dokument dienen:
Persons.xml
010203040506070809101112131415161718
<personList>    <person id="1">        <firstName>Anders</firstName>        <lastName>Hejlsberg</lastName>    </person>    <person id="2">        <firstName>Bjarne</firstName>        <lastName>Stroustrup</lastName>    </person>    <person id="3">        <firstName>James</firstName>        <lastName>Gosling</lastName>    </person>    <person id="4">        <firstName>Rasmus</firstName>        <lastName>Lerdorf</lastName>    </person></personList>
Wir möchten daraus eine (generische) Liste von Person-Objekten erzeugen. Die Klasse soll auch gleich die Methode zur XML-Verarbeitung erhalten, welche mit LINQ to XML nun besonders einfach umzusetzen ist:
Person.cs
010203040506070809101112131415161718192021222324252627
public class Person {    public int PersonID {        get;        set;    }
public string FirstName { get; set; }
public string LastName { get; set; }

public static List<Person> ParseXML(string xml) { return XElement.Parse(xml) .Descendants("person") .Select(p => new Person() { PersonID = Int32.Parse(p.Attribute("id").Value), FirstName = p.Element("firstName").Value, LastName = p.Element("lastName").Value }).ToList(); }}
Das Vorgehen dürfte eigentlich weitestgehend selbsterklärend sein. Obwohl selbstverständlich mehr Funktionalität zur Verfügung steht, dürften mit diesem kleinen Beispiel bereits die wichtigsten Fälle abgedeckt sein. Weitere Informationen finden sich ausgehend von XDocument im MSDN.

Quelltext des .NET-Frameworks veröffentlicht 👍 👎

Einige werden es bereits erfahren haben, dennoch möchte auch ich darauf hinweisen, dass Microsoft weitere große Teile des .NET-Frameworks öffentlich zur Verfügung stellt. Unterstützt wird das Vorhaben durch Roslyn.

Die Inhalte sind dabei durchgängig interaktiv gestaltet und stehen unter der Reference Source License.

Alphabetischer Index mit C# und LINQ 👍 👎

Häufig kann es sinnvoll sein, eine Liste nach Anfangsbuchstaben gruppiert darzustellen. Dies kann unter C# in Verbindung mit LINQ sehr einfach und elegant geschehen, wozu wir wie üblich ein kleines Beispiel durchgehen.

Konkret möchten wir Personen nach Anfangsbuchstabe von LastName gruppiert und darin wiederum nach LastName sortiert ausgeben. Auf Grund der Trivialität der Klasse verweise ich auf das im Artikel zu Eigenschaften in C# präsentierte Beispiel und fahre direkt mit der Liste fort:
Liste von Personen
01020304050607080910111213141516171819202122
List<Person> personList = new List<Person>() {    new Person() {        FirstName = "Harald",        LastName = "Müller"    },    new Person() {        FirstName = "Helga",        LastName = "Schmidt"    },    new Person() {        FirstName = "Karl",        LastName = "Schneider"    },    new Person() {        FirstName = "Olaf",        LastName = "Fischer"    },    new Person() {        FirstName = "Saskia",        LastName = "Weber"    }};
Nun führen wir die Gruppierung ganz einfach per GroupBy(…) aus und speichern dies mit den dazugehörigen Listen per ToDictionary(…) direkt in ein Dictionary:
Liste gruppiert abspeichern
010203
Dictionary<char, List<Person>> personStructure = personList    .GroupBy(p => p.LastName[0])  // Gruppierung nach erstem Buchstaben des Nachnamens    .ToDictionary(k => k.Key, v => v.ToList());
Anschließend können wir die Struktur beispielsweise durchlaufen und auf einer Webpräsenz ausgeben:
Struktur durchlaufen
01020304050607080910
foreach(KeyValuePair<char, List<Person>> data in personStructure) {    // "data.Key" enthält den Anfangsbuchstaben
foreach(Person person in data.Value.OrderBy(p => p.LastName)) {
/** * "person" enthält nun jeweils eine zu eben * diesem Anfangsbuchstaben passende Person. **/ }}
Das Ergebnis einer solchen Vorgehensweise lässt sich u. a. in der neuen Ansicht der Bezirkszuordnungen auf meinem Städteportal für Berlin und Hamburg betrachten. Für diese einfache Darstellung kommt übrigens noch ein zusätzlicher kleiner LINQ-"Trick" mit Select(…) zum Einsatz. Für unser Beispiel könnten wir dazu die innere Schleife schlicht durch Folgendes ersetzen und damit Vor- und Nachname per Komma separiert ausgeben:
Einfache Zeichenketten-Konkatenierung
01
String.Join(", ", data.Value.Select(p => p.FirstName + " " + p.LastName));

Projektverweise

Kategorien / Archiv  |  Übersicht RSS-Feed

Schlagworte

Suche