---
# System prepended metadata

title: Links für PH-Seminar "Was gibt es Neues in C# und .NET"

---

# Links für PH-Seminar "Was gibt es Neues in C# und .NET"

## Organisatorisches

* [Anwesenheitsliste 28.11.](https://forms.microsoft.com/e/yJ5d1PpxxE)
* [Anwesenheitsliste 29.11.](https://forms.microsoft.com/e/5E3AkeVKrA)

## Linkliste

* [Slidesammlung](https://slides.com/rainerstropek)
* [Beispiel für Records](https://github.com/rstropek/Samples/tree/master/CSharp10/RecordsInsideOut)
* [Rainer's C# Unterlagen für die AnfängerInnen](https://htl-leo-prog-1.github.io/programming_fundamentals_cs/)
* ["Fun with Trees" Beispiel](https://github.com/rstropek/Samples/blob/master/CSharp11/FunWithTrees/Program.cs)
* [MS Docs für Minimal API](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/minimal-apis)
* [Fluentvalidation](https://docs.fluentvalidation.net/en/latest/)
* [Beispiel Todo-API von David Fowler](https://github.com/davidfowl/TodoApi)
* [Video: Learning to Love Legacy Code](https://youtu.be/wPjHuvulivM?t=1964)
* [Video: Why web tech is like this](https://www.youtube.com/watch?v=3QEoJRjxnxQ&t=2s)
* [Beispiel: Pattern Matching Inside Out](https://github.com/rstropek/Samples/blob/master/CSharp11/PatternMatchingInsideOut/Program.cs)
* [Isometric Game](https://github.com/rstropek/Samples/tree/master/CSharp11/IsometricGame)

## Online C# Entwicklungsumgebungen

* [sharplab.io](https://sharplab.io)
* [.NET Fiddle](https://dotnetfiddle.net/)
* [VSCode Share Link](https://prod.liveshare.vsengsaas.visualstudio.com/join?87F36D7DCDD27426693294E5D39D452CC863)

## Lambda-Wiederholung

```csharp
// System.Console.WriteLine(Add(1, 2));
// System.Console.WriteLine(Subtract(1, 2));
CalculateAndPrint(1, 2, Add);
CalculateAndPrint(1, 2, Subtract);
CalculateAndPrint(1, 2, (x, y) => x - y);
CalculateAndPrint(1, 2, (x, y) => x * y);
CalculateAndPrint(1, 2, (x, y) => x / y);
CalculateAndPrint(1.0, 2.0, (x, y) => x / y);
CalculateAndPrint("Hello ", "World", (x, y) => x + y);

// Strategy Pattern
void CalculateAndPrint<T>(T x, T y, Func<T, T, T> f) 
{
    var result = f(x, y);
    System.Console.WriteLine(result);
}

Filter(new [] { 1, 2, 3, 4, 5 }, x => x % 2 == 0);
Filter(new [] { "Tom", "Tim", "Hans" }, x => x.StartsWith("T"));

IEnumerable<T> Filter<T>(IEnumerable<T> source, Func<T, bool> predicate)
{
    foreach (var item in source)
    {
        if (predicate(item))
        {
            yield return item;
        }
    }
}

int Add(int x, int y)
{
    return x + y;
}

int Subtract(int x, int y)
{
    return x - y;
}
```

## Minimal API Mini-Beispiel

```csharp
using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);

var app = builder.Build();

app.UseHttpsRedirection();
app.MapGet("/ping", () => "pong");
app.MapGet("/calc", (int a, int b) => a + b);
app.MapPost("/calc", (CalcRequestDto param) => new CalcResponseDto(param.A + param.B));
app.MapPost("/calc-advanced", (CalcAdvancedRequestDto param) =>
{
    if (param.Operator == "/" && param.B == 0)
    {
        return Results.BadRequest(new ProblemDetails() { Type = "https://errors.com/dbz", Title = "Divide by zero" });
    }
    
    return Results.Ok(new CalcResponseDto(param.Operator switch
    {
        "+" => param.A + param.B,
        "-" => param.A - param.B,
        "*" => param.A * param.B,
        "/" => param.A / param.B,
        _ => 0
    }));
});

app.Run();

record CalcRequestDto(int A, int B);
record CalcAdvancedRequestDto(int A, int B, string Operator);
record CalcResponseDto(int Result);
```

## `IAsyncEnumerable` Beispiel

```csharp
await foreach(var n in GetNumbers(10))
{
    System.Console.WriteLine(n);
}

async IAsyncEnumerable<int> GetNumbers(int max)
{
    for(var i = 0; i < max; i++)
    {
        var val = await ReadNumberFromSensor();
        yield return val;
    }
}

Task<int> ReadNumberFromSensor()
{
    return Task.FromResult(42);
}
```