Novinky v C# 13

20. 11. 2024

Sdílet

2020-06-PHP-programátor.jpg Autor: Getty

Dňa 12. novembra bola vydaná vývojová platforma .NET vo verzii 9 v rámci ktorej jazyk C# prešiel na verziu 13 a dočkal sa niekoľkých menších noviniek .

Medzi najzaujímavejšie novinky patrí možnosť použitia kľúčového slova params pre IEnumerable, nový operátor spätnej indexácie ^ pri poliach a nové kľúčové slovo field pre prístup k podkladovému poľu.

Čo sa týka základnej knižnice, určite zaujmú nové LINQ funkcie Index, GroupBy, CountBy, AggregateBy, a tiež funkcia pre prácu s regulárnymi výrazmi Regex.Enumera­teSplits.

Použitie operátora spätnej indexácie a kľúčového slova params demonštruje tento príklad:

int[] vals = new int[10];

vals[^1] = 0;
vals[^2] = 1;
vals[^3] = 2;
vals[^4] = 3;
vals[^5] = 4;
vals[^6] = 5;
vals[^7] = 6;
vals[^8] = 7;
vals[^9] = 8;
vals[^10] = 9;

Console.WriteLine(string.Join(",", vals));

Console.WriteLine("--------------------------");

Console.WriteLine(sumVals(1, 2, 3));
Console.WriteLine(sumVals(1, 2, 3, 4));
Console.WriteLine(sumVals(1, 2, 3, 4, 5));

int sumVals(params IEnumerable<int> vals)
{
    int sum = 0;

    foreach (int val in vals)
    {
        sum += val;
    }

    return sum;
}

Kľúčové slovo field sa používa v prípade potreby k prístupu k tzv. backing fields, ktoré sú autogenerované kompilátorom. Keďže je field zatiaľ v preview verzii, potrebujeme si pridať do projektu voľbu <LangVersion>pre­view</LangVer­sion>.

var user = new User("John", "Doe", "Gardener");
Console.WriteLine(user);

var user2 = new User("John", "Doe", "DRIVER");
Console.WriteLine(user2);



class User
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Occupation { get; set { field = value.ToLower(); } }

    public User(string FirstName, string LastName, string Occupation) =>
        (this.FirstName, this.LastName, this.Occupation) = (FirstName, LastName, Occupation);


    public override string ToString() =>
        $"User {{ {this.FirstName} {this.LastName} {this.Occupation} }}";
}

Nová členská funkcia Regex.Enumera­teSplits umožňuje efektívnejšie iterovať porezanými reťazcami.

using System.Text.RegularExpressions;

ReadOnlySpan<char> text = @"
There are two falcons in the sky. A falcon is a majestic bird.
We saw three foxes in the field. One fox was tiny.
";

foreach (var r in Regex.EnumerateSplits(text, @"[\s.]+"))
{
    string field = text[r].ToString();

    if (!string.IsNullOrEmpty(field))
    {
        Console.WriteLine($"{field}: {r}");
    }
}

Nakoniec funkcie Index, GroupBy, CountBy, AggregateBy obohacujú LINQ o nové šikovné funkcie pre analýzu dát.

List<int> vals2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

IEnumerable<IGrouping<bool, int>> res = vals2.GroupBy(e => e % 2 == 0);

foreach (var group in res)
{
    Console.WriteLine(group.Key);
    foreach (var e in group)
    {
        Console.WriteLine(e);
    }
}


Purchase[] purchases = {
    new("Laptop", new DateTime(2023, 1, 15)),
    new("Phone", new DateTime(2023, 4, 10)),
    new("Tablet", new DateTime(2023, 7, 5)),
    new("Chair", new DateTime(2023, 8, 8)),
    new("Monitor", new DateTime(2023, 10, 20)),
    new("Keyboard", new DateTime(2023, 3, 30))
};

var purchasesByQuarter = purchases
    .AggregateBy(
        keySelector: purchase => (purchase.Date.Month - 1) / 3 + 1,
        seed: new List<string>(),
        func: (group, purchase) => [.. group, purchase.Item]
    );

foreach (var (quarter, purchaseGroup) in purchasesByQuarter)
{
    Console.WriteLine($"Purchases in Q{quarter}: {string.Join(", ", purchaseGroup)}");
}



List<User> users =
[
    new ("John", "Doe", 1230),
    new ("Lucy", "Novak", 670),
    new ("Ben", "Walter", 2050),
    new ("Robin", "Brown", 2300),
    new ("Amy", "Doe", 1250),
    new ("Joe", "Draker", 1190),
    new ("Janet", "Doe", 980),
    new ("Albert", "Novak", 1930),
];

IEnumerable<KeyValuePair<bool, int>> res2 = users.CountBy(user => user.Salary < 1000);

foreach (KeyValuePair<bool, int> kv in res2)
{
    Console.WriteLine($"{kv.Key} {kv.Value}");
}

IEnumerable<(int, User)> users2 = users.Index();

foreach (var (idx, user) in users2)
{
    Console.WriteLine($"{idx} - {user.FirstName} {user.FirstName}");
}


record Purchase(string Item, DateTime Date);
record User(string FirstName, string LastName, int Salary);

Tato zprávička byla zaslána čtenářem serveru Root.cz pomocí formuláře Přidat zprávičku. Děkujeme!

Našli jste v článku chybu?

Autor zprávičky