Typ generyczny List
Stronę tą wyświetlono już: 2801 razy
Deklaracja i dodawanie elementów do obiektu typu List
Typ List jest listą, w której można przechowywać obiekty podanego przy deklaracji typu. Oto przykład utworzenia obiektu typu List:
- var list = new List<int>();
Od tej pory do list można dodawać tylko i wyłącznie obiekty typu int. Sposób dodawania ich jest bardzo podobny do tego związanego z typem ArrayList i wygląda następująco:
- list.Add(10);
Można też dodawać wiele elementów, które zostały zawarte w innym iterowalnym obiekcie klasy, który musi przechowywać dane tego samego typu co
- int[] t = {10, 20, 30, 40};
- list.AddRange(t);
Deklaracja kontenera List znajduje się w przestrzeni nazw:
- using System.Collections.Generic;
Wstawianie elementów do kontenera typu List
I znów, tak jak w przypadku typu ArrayList tak i w przypadku List można wstawiać pojedynczy element do kontenera za pomocą metody Insert. Oto przykład:
- var list = new List<int>();
- int[] t = {10, 20, 30, 40};
- list.AddRange(t);
- list.Insert(2, 10);
- foreach(int i in list)
- {
- Console.WriteLine(i.ToString());
- }
Wynik działania powyższego kodu:
10 20 10 30 40
Można również wstawić całą serię wartości, zapisanych w jakimś iterowalnym obiekcie za pomocą metody InsertRange:
- var list = new List<int>();
- int[] t = {10, 20, 30, 40};
- list.AddRange(t);
- list.InsertRange(2, t);
- foreach(int i in list)
- {
- Console.WriteLine(i.ToString());
- }
Wynik działania powyższego kodu:
10 20 10 20 10 30 40 10 30 40
Usuwanie elementów z kontenera typu List
Za pomocą metody Remove można usunąć pierwszy element, jaki wystąpi w kontenerze i będzie miał podaną wartość:
- var list = new List<int>();
- int[] t = {10, 20, 30, 30, 40};
- list.AddRange(t);
- list.Remove(30);
- foreach(int i in list)
- {
- Console.WriteLine(i.ToString());
- }
Wynik działania powyższego kodu:
10 20 10 30 40
Można również usunąć element znajdujący się na podanej pozycji w kontenerze za pomocą metody RemoveAt:
- var list = new List<int>();
- int[] t = {10, 20, 30, 30, 40};
- list.AddRange(t);
- list.RemoveAt(3);
- foreach(int i in list)
- {
- Console.WriteLine(i.ToString());
- }
Wynik działania powyższego kodu:
10 20 10 30 40
Możliwe jest również usunięcie wielu elementów za pomocą metody RomoveRange:
- var list = new List<int>();
- int[] t = {10, 20, 30, 30, 40};
- list.AddRange(t);
- list.RemoveRange(3, 2);
- foreach(int i in list)
- {
- Console.WriteLine(i.ToString());
- }
Wynik działania powyższego kodu:
10 20 10 40
Możliwe jest usuwanie elementów według własnych kryteriów, w tym celu trzeba utworzyć metodę statyczną, która będzie zwracała wartość typu bool i przyjmowała jako argument jeden parametr typu, który przechowuje dany kontener. Przykładowa metoda:
- static bool LessThenTen(int t)
- {
- return t < 10;
- }
A teraz usuwanie wszystkich elementów z kontenera mniejszych od 10-ciu przy pomocy metody RemoveAll:
- var list = new List<int>();
- int[] t = {-10, 0, 10, 20, 30};
- list.AddRange(t);
- list.RemoveAll(LessThenTen);
- foreach(int i in list)
- {
- Console.WriteLine(i.ToString());
- }
Wynik działania powyższego kodu:
10 20 10 40
Chcesz usunąć wszystkie elementy z kontenera? Wystarczy użyć metody Clear.
Odwracanie kolejności elementów zawartych w kontenerze
Za pomocą metody Reverse można odwrócić kolejność ułożenia elementów zawartych w kontenerze:
- var list = new List<int>();
- int[] t = {1, 2, 3, 4, 5};
- list.AddRange(t);
- list.Reverse();
- foreach(int i in list)
- {
- Console.WriteLine(i.ToString());
- }
Wynik działania powyższego kodu:
5 4 3 2 1
Sortowanie elementów kontenera
Metoda Sort umożliwia sortowanie elementów, pod warunkiem że te dziedziczą po IComparable. Oto przykład działania:
- var list = new List<int>();
- int[] t = {4, 1, 3, 2, 5};
- list.AddRange(t);
- list.Sort();
- foreach(int i in list)
- {
- Console.WriteLine(i.ToString());
- }
Wynik działania powyższego kodu:
1 2 3 4 5
Można też użyć przeładowanej metody Sort, która przyjmuje jako argument wskaźnik do metody porównującej. Metoda porównująca musi zwracać wartość liczbową typu int i przyjmować dwa argumenty typu, odpowiadającemu typowi obiektów, jakie dany kontener przechowuje. Przykład funkcji porównującej, która umożliwi sortowania od najmniejszego do największego elementu:
- static int FromMaxToMin(int a, int b)
- {
- return b - a;
- }
A oto i przykład zastosowania w praktyce powyższej metody do sortowania kontenera zwierającego elementy typu int:
- var list = new List<int>();
- int[] t = {4, 1, 3, 2, 5};
- list.AddRange(t);
- list.Sort(FromMaxToMin);
- foreach(int i in list)
- {
- Console.WriteLine(i.ToString());
- }
Wynik działania powyższego kodu:
5 4 3 2 1
Kopiowanie zawartości kontenera do tablicy
Istnieje metoda ToArray, która zwraca kopię tablicy obiektów zawartych w kontenerze. Oto przykład użycia:
- var list = new List<int>();
- int[] t = {1, 2, 3, 4, 5};
- list.AddRange(t);
- int[] t2 = list.ToArray();
- foreach(int i in t2)
- {
- Console.WriteLine(i.ToString());
- }
Wynik działania powyższego kodu:
1 2 3 4 5
Indeksowanie i właściwość Count
Do elementów kontenera typu List można się odwoływać tak jak do elementów tablicy Array czy też ArrayList. Z kolei właściwość Count umożliwia pozyskanie informacji o liczbie elementów tablicy:
- var list = new List<int>();
- int[] t = {1, 2, 3, 4, 5};
- list.AddRange(t);
- list[2] = 4;
- foreach(int i in t2)
- {
- Console.WriteLine(i.ToString());
- }
- Console.WriteLine("Liczba elementów w kontenerze: " + list.Count);
Wynik działania powyższego kodu:
1 2 4 4 5 Liczba elementów w kontenerze: 5
Sumowanie danych zawartych w kontenerze
Dla typów liczbowych można użyć metody Sum:
- var list = new List<int>();
- int[] t = {1, 2, 3, 4, 5};
- list.AddRange(t);
- Console.WriteLine(list.Sum());
Wynik działania powyższego kodu:
15
Dla prostej klasy Point2D:
- public class Point2D{
- public double x;
- public double y;
- public Point2D(double x, double y)
- {
- this.x = x;
- this.y = y;
- }
- };
Można wykonać sumowanie poszczególnych jej pól w sposób następujący:
- var p2dlist = new List<Point2D>();
- p2dlist.Add(new Point2D(20, 30));
- p2dlist.Add(new Point2D(100, 400));
- double x_sum = p2dlist.Sum(pkg => pkg.X);
- Console.WriteLine(x_sum);
- double y_sum = p2dlist.Sum(pkg => pkg.Y);
- Console.WriteLine(y_sum);
Wynik działania powyższego kodu:
120 430
Znajdowanie największego elementu w kontenerze
Dla typów prostych jak np. int, czy też double przechowywanych w kontenerze można użyć bezparametrowej metody Max:
- var list = new List<int>();
- int[] t = {20, 40, 5, 23, 100, -20, 0};
- list.AddRange(t);
- Console.WriteLine("Maksymalna wartość w kontenerze: " + list.Max());
Wynik działania powyższego kodu:
Maksymalna wartość w kontenerze: 100
Znajdowanie najmniejszego elementu w kontenerze
Dla typów prostych jak np. int, czy też double przechowywanych w kontenerze można użyć bezparametrowej metody Min:
- var list = new List<int>();
- int[] t = {20, 40, 5, 23, 100, -20, 0};
- list.AddRange(t);
- Console.WriteLine("Minimalna wartość w kontenerze: " + list.Min());
Wynik działania powyższego kodu:
Minimalna wartość w kontenerze: -20

Tytuł:
Wzorce projektowe w .NET Core 3. Projektowanie zorientowane obiektowo z wykorzystaniem C# i F#
Autor:
Dmitri Nesteruk

Tytuł:
Jak pisać świetne gry 2D w Unity. Niezależne programowanie w języku C#
Autor:
Jared Halpern

Tytuł:
C# 9.0 w pigułce
Autor:
Joseph Albahari

Tytuł:
C# 9.0. Leksykon kieszonkowy
Autor:
Joseph Albahari, Ben Albahari

Tytuł:
C# 8.0. Kompletny przewodnik dla praktyków. Wydanie VII
Autor:
Mark Michaelis

Tytuł:
C# 8.0 w pigułce
Autor:
Joseph Albahari, Eric Johannsen

Tytuł:
Asynchroniczność i wielowątkowość w języku C#
Autor:
Grzegorz Lang

Tytuł:
C# 8.0. Programowanie. Tworzenie aplikacji Windows, internetowych oraz biurowych
Autor:
Ian Griffiths

Tytuł:
C# 8.0. Leksykon kieszonkowy
Autor:
Joseph Albahari, Ben Albahari

Tytuł:
Wzorce projektowe w .NET. Projektowanie zorientowane obiektowo z wykorzystaniem C# i F#
Autor:
Dmitri Nesteruk