Mateusz Stanek

Przetwarzanie kolekcji z Linq to Object cz4

Dzisiaj ostatni odcinek z serii o Linq to object. Opowiem nieco więcej o metodach statystycznych oraz innych dostępnych w linq.

Metody Statystyczne

Metody statystyczne zwracają nam konkretne wartości obliczane na podstawie elementów z kolekcji.

Min, Max

Metody wybierają najmniejszą i największą wartość w naszej kolekcji. Można szeregować elementy po wartościach liczbowych lub jeśli nasz typ implementuje interface IComparable po naszych typach wprost.

C#
1
2
3
var numbers = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int minValue = numbers.Min();
int maxValue = numbers.Max();

Sum, Average

Metody te potrafią obliczyć sumę oraz średnią wartości liczbowych. W parametrach możemy podać selektor właściwości elementu.

C#
1
2
3
var numbers = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int sumValue = numbers.Sum();
double averageValue = numbers.Average();

Aggregate

Metoda umożliwiająca agregację danych. W najprostszej formie przyjmuje tylko dwuparametrową funkcję agregującą, gdzie pierwszym parametrem jest agregat a drugim kolejna wartość.

C#
1
2
3
var numbers = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
// aggregate elements with index weight
int aggregate = numbers.Aggregate(new Tuple<int,int>(1,0),(acc, next)=> new  Tuple<int, int>(acc.Item1 +1,acc.Item2+(next*acc.Item1)),acc=>acc.Item2);

Count

Umożliwia policzenie elementów w kolekcji. W postaci bezparametrowej liczy wszystkie elementy, aczkolwiek możemy wprowadzić ograniczenia i policzyć tylko interesujące nas obiekty.

C#
1
2
3
var numbers = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int elementsNumber = numbers.Count();
int oddElementsNumber = numbers.Count(n=>n % 2 == 0);

Any

Przydatna metoda, jeśli chcemy szybko sprawdzić czy kolekcja posiada odpowiednie elementy, bądź elementy w ogóle. Moim zdaniem jest czytelniejsza, gdy chodzi o wykonanie akcji, jeśli w kolekcji są elementy od standardowego przyrównania ilości elementów do zera.

C#
1
2
3
var numbers = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
bool anyElement = numbers.Any();
int anyNegativElement = numbers.Any(n => n < 0);

Przekształcenia kolekcji

Ostatnim elementem jaki chciałbym opisać będą przekształcenia kolekcji, gdzie z jednej kolekcji tworzymy inne.

Concat

Służy do łączenia kolekcji ze sobą.  Przy łączeniu kolejność elementów nie zostanie zmieniona a jedynie po zakończeniu pierwszego zbioru w kolekcji dodane zostaną elementy z drugiego zbioru.

C#
1
2
3
var numbers = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var numbers2 = new List<int>() { 6, 7, 8, 9, 10, 11, 14, 5 };
IEnumerable<int> both = numbers.Concat(numbers2);

Union

Działa podobnie do Concat z tą małą różnicą, iż w wynikowej kolekcji będziemy mieli tylko i wyłącznie unikalne wartości. Można to porównać do wykorzystania łańcucha Concat -> Distinct.

C#
1
2
3
var numbers = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var numbers2 = new List<int>() { 6, 7, 8, 9, 10, 11, 14, 5 };
IEnumerable<int> both = numbers.Union(numbers2);

GroupBy

Metoda grupująca, umożliwia zgrupowanie elementów. Wynikowo otrzymujemy kolekcję grup, gdzie każda grupa posiada klucz oraz enumerator na kolejne elementy grupy.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class OrderData
    {
        public string ClientId { get; set; }
        public string ProductId { get; set; }
        public int Amount { get; set; }
    }
 
//example
 
var orders = new List<OrderData>();
 
orders.Add(new OrderData() { ProductId = "prod1", ClientId = "client1", Amount = 3 });
orders.Add(new OrderData() { ProductId = "prod1", ClientId = "client2", Amount = 2 });
orders.Add(new OrderData() { ProductId = "prod1", ClientId = "client3", Amount = 1 });
orders.Add(new OrderData() { ProductId = "prod1", ClientId = "client4", Amount = 3 });
orders.Add(new OrderData() { ProductId = "prod3", ClientId = "client1", Amount = 3 });
orders.Add(new OrderData() { ProductId = "prod2", ClientId = "client1", Amount = 3 });
orders.Add(new OrderData() { ProductId = "prod2", ClientId = "client2", Amount = 3 });
orders.Add(new OrderData() { ProductId = "prod2", ClientId = "client4", Amount = 3 });
 
var clientGrops = orders.GroupBy(o => o.ClientId, o => o);
foreach(var client in clientGrops)
{
    Console.WriteLine(client.Key);
    foreach (var item in client)
    {
        Console.WriteLine($"\t{item.ProductId} {item.Amount}");
     }
}

To  byłoby tyle na dziś. Opisałem chyba większość metod, z których korzystam na co dzień i które w moim mniemaniu są ważne i warto, żeby je znać. Przykłady wykorzystania jak zwykle na GitHubie https://github.com/Matejkos/BlogProjects/tree/master/LinqObjectOperations

Related posts:

  1. Refleksja – odczyt metadanych
  2. Obsługa wyjątków
  3. Przetwarzanie kolekcji z Linq to Object cz2
  4. Słowa kluczowe Is i As
23 lutego 2018 MiroBurn Challange Programowanie
No Comments

Przetwarzanie kolekcji z Linq to Object cz3

Code review

Dodaj komentarz Anuluj pisanie odpowiedzi

Zobacz

  • Mateusz Stanek o mnie
Mateusz Stanek

Zaprzyjaźnione blogi

SGDev.pl

Ostatnie wpisy

  • Rola Prelegent
  • Elektronika – powrót do starego hobby
  • Badger2040
  • 2023 Tydzień 11
  • 2023 Tydzień 10

Najnowsze komentarze

  • Lukas L - Podsumowanie roku 2022
  • Oktawian Kurzynski - Enumeracja – wartość domyślna
  • Mateusz Stanek - Typy generyczne
  • Ola - Enumeracja – wartość domyślna
  • Typy generyczne w języku C# nie są 'rozwiązywane' w czasie kompilacji - Typy generyczne

Archiwa

  • marzec 2025
  • marzec 2023
  • luty 2023
  • styczeń 2023
  • grudzień 2022
  • marzec 2018
  • luty 2018
  • kwiecień 2017
  • marzec 2017
  • luty 2017

Kategorie

  • Bez kategorii
  • DSP2017
  • Elektronika
  • MiroBurn Challange
  • Narzędzia
  • Podsumowanie
  • Produktywność
  • Programowanie
  • Projekt
  • Prywatne
  • Rok 2023
  • Tips

Ostatnie wpisy

  • Rola Prelegent
  • Elektronika – powrót do starego hobby
  • Badger2040
  • 2023 Tydzień 11
  • 2023 Tydzień 10
Dumnie wspierane przez WordPressa | Motyw: Neblue by NEThemes.
Ta strona korzysta z ciasteczek aby świadczyć usługi na najwyższym poziomie. Dalsze korzystanie ze strony oznacza, że zgadzasz się na ich użycie.Zgoda
Privacy & Cookies Policy

Privacy Overview

This website uses cookies to improve your experience while you navigate through the website. Out of these cookies, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may have an effect on your browsing experience.
Necessary
Always Enabled
Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.
Non-necessary
Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.
SAVE & ACCEPT