Typ generyczny List

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 4222 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 list, np:

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
Propozycje książek