PHP-Funktionen in C# (noch nicht) als Programmbibliothek
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.
Process XML Documents with LINQ to XML
Als Ausgangslage für unser Beispiel soll folgendes XML-Dokument dienen:
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>
Person
-Objekten erzeugen. Die Klasse soll auch gleich die Methode zur XML-Verarbeitung erhalten, welche mit LINQ to XML nun besonders einfach umzusetzen ist:
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(); }}
XDocument
im MSDN. .NET framework source code published
Die Inhalte sind dabei durchgängig interaktiv gestaltet und stehen unter der Reference Source License.
Alphabetical Index with C# and LINQ
Konkret möchten wir
Person
en 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:
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" }};
GroupBy(…)
aus und speichern dies mit den dazugehörigen Listen per ToDictionary(…)
direkt in ein Dictionary
:
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());
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. **/ }}
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:
01
String.Join(", ", data.Value.Select(p => p.FirstName + " " + p.LastName));
Project links
-
BitStadt – Stadtportal
Berlin · Hamburg · Amsterdam -
CCC – Fahrplan
Schedules for the CCCongress
Categories / Archive | Übersicht
- PHP functions in C# (136)
- Dictionary (257)