Skip to content

Commit

Permalink
Revise L26
Browse files Browse the repository at this point in the history
  • Loading branch information
SebastianZug committed Jul 1, 2024
1 parent 421a8fc commit 9ef890f
Show file tree
Hide file tree
Showing 7 changed files with 258,119 additions and 20 deletions.
4 changes: 2 additions & 2 deletions 03_CsharpGrundlagenI.md
Original file line number Diff line number Diff line change
Expand Up @@ -972,13 +972,13 @@ alle numerischen Typen anwendbar.
{{2}}
**********************************************************************

In der Vorlesung 3 war bereits über die bitweisen boolschen Operatoren gesprochen worden. Diese verknüpfen Zahlenwerte auf Bitniveau. Die gleiche Notation (einzelne Operatorsymbole `&`, `|`) kann auch zur Verknüpfung von Boolschen Aussagen genutzt werden.
In der Vorlesung 3 war bereits über die bitweisen booleschen Operatoren gesprochen worden. Diese verknüpfen Zahlenwerte auf Bitniveau. Die gleiche Notation (einzelne Operatorsymbole `&`, `|`) kann auch zur Verknüpfung von Booleschen Aussagen genutzt werden.

Darüber hinaus existieren die doppelten Schreibweisen als eigenständige Operatorkonstrukte - `&&`, , `||`. Bei der Anwendung auf boolsche Variablen wird
dabei zwischen "nicht-konditionalen" und "konditionalen" Operatoren
unterschieden.

Bedeutung der boolschen Operatoren für unterschiedliche Datentypen:
Bedeutung der booleschen Operatoren für unterschiedliche Datentypen:

| Operation | numerische Typen | boolsche Variablen |
| --------- | -------------------------------------------------- | -------------------------------- |
Expand Down
2 changes: 1 addition & 1 deletion 06_ProgrammflussUndFunktionen.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ Der letztgenannte Bereich wurde im Zusammenhang mit der Ein- und Ausgabe von Dat

**if**

Verzweigungen in C# sind allein aufgrund von boolschen Ausdrücken realisiert. Eine
Verzweigungen in C# sind allein aufgrund von booleschen Ausdrücken realisiert. Eine
implizite Typwandlung wie in C `if (value)` ist nicht vorgesehen. Dabei sind entsprechend kombinierte Ausdrücke möglich, die auf boolsche Operatoren basieren.

```csharp
Expand Down
43 changes: 26 additions & 17 deletions 26_LINQ.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ class ReadingCSV
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
</Project>
```
Expand Down Expand Up @@ -133,7 +133,7 @@ class ReadingCSV
var students = DataFrame.LoadCsv(path, separator:',',header:true);

Console.WriteLine(students.Info());
var topicStat = students["Topics"].ValueCounts();
var topicStat = students["Topic"].ValueCounts();
Console.WriteLine(topicStat);
}
}
Expand All @@ -142,7 +142,7 @@ class ReadingCSV
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Data.Analysis" Version="0.19.1" />
Expand Down Expand Up @@ -435,7 +435,7 @@ WIE festlegt. Dabei strukturieren sich die Befehle in 4 Kategorien:

Eine Datenbanktabelle stellt eine Datenbank-Relation dar. Die Relation ist Namensgeber und Grundlage der relationalen Datenbanken.

![OOPGeschichte](./img/25_LINQ/SQL-Beispiel.png "Relationale Datenbank [^DatenbankSchema]")
![OOPGeschichte](./img/25_LINQ/SQL-Beispiel.png "Relationale Datenbank - Autor: Nils Boßung, https://de.wikipedia.org/wiki/SQL#/media/Datei:SQL-Beispiel.svg")


*******************************************************************************
Expand All @@ -451,7 +451,7 @@ INSERT INTO Student SELECT * from ?;
```
``` text -student.csv
MatrNr,Name
26120,Fichte
26120,Fin
25403,Jonas
27103,Fauler
```
Expand Down Expand Up @@ -509,27 +509,40 @@ FROM Student;


``` sql Abfrage mit Spaltenauswahl
SELECT VorlNr, Titel
SELECT VorlNr
FROM Vorlesung;
```
@AlaSQL.eval

Eine erste Form der Filterung kann nun darin bestehen, zunächst die Anzahl der überhaupt aktiven Studierenden zu bestimmen. Diese müssten in der Tabelle `hoert` eingetragen sein. `DISTINCT` implementiert die Auswahl von eindeutigen Werten.

``` sql Abfrage mit eindeutigen Werten
SELECT DISTINCT MatrNr
FROM hoert;
```
@AlaSQL.eval

`WHERE` ermöglicht die Filterung von Zeilen, die einem oder mehreren Kriterien genügen.
`LIKE` kann mit verschiedenen Platzhaltern verwendet werden: `_` steht für ein einzelnes beliebiges Zeichen, `%` steht für eine beliebige Zeichenfolge. Manche Datenbanksysteme bieten weitere solche Wildcard-Zeichen an, etwa für Zeichenmengen.

``` sql Abfrage mit Filter und Sortierung
SELECT VorlNr, Titel
FROM Vorlesung
WHERE Titel = 'ET';
```
@AlaSQL.eval

`LIKE` kann mit verschiedenen Platzhaltern verwendet werden: _ steht für ein einzelnes beliebiges Zeichen, % steht für eine beliebige Zeichenfolge. Manche Datenbanksysteme bieten weitere solche Wildcard-Zeichen an, etwa für Zeichenmengen.
`ORDER BY` öffnet die Möglichkeit die Reihung anzupassen. `ASC` und `DESC` steuern die Sortierreihenfolge.

``` sql Abfrage mit Filter und Sortierung
SELECT Name
FROM Student
WHERE Name LIKE 'F%'
ORDER BY Name DESC;
```
@AlaSQL.eval

`ORDER BY` öffnet die Möglichkeit die Reihung anzupassen.
`JOIN` erlaubt es die Relationen zwischen einzelnen Datenbanktabellen aufzulösen. Dabei kann mit `INNER` und `OUTER` bzw `LEFT` und `RIGHT` die Auswahl über der Schnittmenge beschrieben werden.

``` sql Verbund
SELECT Vorlesung.VorlNr, Vorlesung.Titel, Professor.PersNr, Professor.Name
Expand All @@ -538,7 +551,7 @@ INNER JOIN Vorlesung ON Professor.PersNr = Vorlesung.PersNr;
```
@AlaSQL.eval

`JOIN` erlaubt es die Relationen zwischen einzelnen Datenbanktabellen aufzulösen. Dabei kann mit `INNER` und `OUTER` bzw `LEFT` und `RIGHT` die Auswahl über der Schnittmenge beschrieben werden.
`GROUP BY` ermöglicht die Gruppierung von Zeilen, die ein gemeinsames Merkmal aufweisen. `COUNT` zählt die Anzahl der Zeilen, die in die Gruppe fallen.

``` sql Gruppierung mit Aggregat-Funktionen
SELECT COUNT(Vorlesung.PersNr) AS Anzahl, Professor.PersNr, Professor.Name
Expand All @@ -550,8 +563,6 @@ GROUP BY Professor.Name, Professor.PersNr;

****************************************************************

[^DatenbankSchema]: Wikipedia "SQL", Nils Boßung, https://de.wikipedia.org/wiki/SQL#/media/Datei:SQL-Beispiel.svg

## LINQ Umsetzung

*Language Integrated Query* (LINQ) zielt auf die direkte Integration von
Expand Down Expand Up @@ -1095,10 +1106,10 @@ Wieso hat meine Klasse `Student` plötzlich eine Methode `where`? Hier nutzen wi

Dabei wird die eigentliche Filterfunktion als Delegat übergeben, dies wiederum
kann durch eine Lambdafunktion ausgedrückt werden.
https://docs.microsoft.com/de-de/dotnet/api/system.linq.enumerable.where?view=netframework-4.8
https://learn.microsoft.com/de-de/dotnet/api/system.linq.enumerable.where?view=net-8.0

Dabei beschreiben die Lambdafunktionen sogenannten Prädikate, Funktionen, die eine
bestimmte Bedingung prüfen und einen boolschen Wert zurückgeben.
bestimmte Bedingung prüfen und einen booleschen Wert zurückgeben.

```csharp WhereExample
using System;
Expand Down Expand Up @@ -1384,8 +1395,7 @@ https://docs.microsoft.com/de-de/dotnet/csharp/programming-guide/concepts/linq/t

Für die Vereinigten Staaten liegen umfangreiche Datensätze zur Namensgebung von
Neugeborenen seit 1880 vor. Eine entsprechende csv-Datei (comma separated file)
findet sich im Projektordner und /data, sie umfasst 258.000 Einträge. Diese sind
wie folgt gegliedert
ist wie folgt gegliedert

```
1880,"John",0.081541,"boy"
Expand All @@ -1400,5 +1410,4 @@ Der Datensatz steht zum Download unter
https://osf.io/d2vyg/
bereit.

Lesen Sie aus den Daten die jeweils am häufigsten vergebenen Vornamen aus und
bestimmen Sie deren Anteil innerhalb des Jahrganges.
Im Code-Ordner liegen Beispielimplementierungen für Sie bereit. Damit können Sie
10 changes: 10 additions & 0 deletions code/26_LINQ/LINQbabynames/LINQbabynames.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

</Project>
79 changes: 79 additions & 0 deletions code/26_LINQ/LINQbabynames/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Microsoft.VisualBasic.FileIO;

class Program
{
static void Main(string[] args)
{
var path = @"../babynames.csv";
List<BabyName> namelist = new List<BabyName>();
using (TextFieldParser csvReader = new TextFieldParser(path))
{
csvReader.CommentTokens = new string[] { "#" };
csvReader.SetDelimiters(new string[] { "," });
csvReader.HasFieldsEnclosedInQuotes = true;
csvReader.ReadLine();

while (!csvReader.EndOfData)
{
// Read current line fields, pointer moves to the next line.
string[]? fields = csvReader.ReadFields();
var newRecord = new BabyName(year_string: fields[0], name_string: fields[1],
percent_string: fields[2], gender_string: fields[3]);
namelist.Add(newRecord);
}
}

// Angabe mit LINQ Semantik
// Was sind die zehn Namen von Jungen mit den höchsten Anteilen dem gesamten Datenzeitraum?
var query = from s in namelist
where s.gender == "boy"
orderby s.percent descending
select s;

// Beispiel mit Methoden Syntax
// Was sind die zehn Namen von Mädchen mit den höchsten Anteilen dem gesamten Datenzeitraum?
var query2 = namelist.Where(x => x.gender == "girl")
.OrderByDescending(x => x.percent);

Console.WriteLine("\n\nTop 10 Jungen Namen Top 10 Mädchen Namen");
Console.WriteLine("---------------------- ----------------------");
for (int i = 0; i < 10; i++){
var boys = query.ElementAt(i);
var girls = query2.ElementAt(i);
Console.Write("{0,-6} - {1,-10} {2:0.000}", boys.year, boys.name, boys.percent);
Console.WriteLine(" {0,-6} - {1,-10} {2:0.000}", girls.year, girls.name, girls.percent);
}
}
}

class BabyName: IComparable
{
// Readonly properties can only be set in the constructor.
public int year { get; private set; }
public string name { get; private set; }
public double percent { get; private set; }
public string gender { get; private set; }

public BabyName(string year_string, string name_string,
string percent_string, string gender_string)
{
year = int.Parse(year_string);
name = name_string;
percent = double.Parse(percent_string);
gender = gender_string;
}

public override string ToString(){
return $"{this.year} - {this.name}";
}

public int CompareTo(object obj){
if (obj == null) return 1;
BabyName otherName = obj as BabyName;
return this.percent>otherName.percent ? 1 : -1;
}
}
Loading

0 comments on commit 9ef890f

Please sign in to comment.