Typ generyczny List

Stronę tą wyświetlono już: 259 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:

Listing 1
  1. 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:

Listing 2
  1. 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:

Listing 3
  1. int[] t = {10, 20, 30, 40};
  2. list.AddRange(t);

Deklaracja kontenera List znajduje się w przestrzeni nazw:

Listing 4
  1. 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:

Listing 5
  1. var list = new List<int>();
  2. int[] t = {10, 20, 30, 40};
  3. list.AddRange(t);
  4. list.Insert(2, 10);
  5. foreach(int i in list)
  6. {
  7. Console.WriteLine(i.ToString());
  8. }

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:

Listing 6
  1. var list = new List<int>();
  2. int[] t = {10, 20, 30, 40};
  3. list.AddRange(t);
  4. list.InsertRange(2, t);
  5. foreach(int i in list)
  6. {
  7. Console.WriteLine(i.ToString());
  8. }

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ść:

Listing 7
  1. var list = new List<int>();
  2. int[] t = {10, 20, 30, 30, 40};
  3. list.AddRange(t);
  4. list.Remove(30);
  5. foreach(int i in list)
  6. {
  7. Console.WriteLine(i.ToString());
  8. }

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:

Listing 8
  1. var list = new List<int>();
  2. int[] t = {10, 20, 30, 30, 40};
  3. list.AddRange(t);
  4. list.RemoveAt(3);
  5. foreach(int i in list)
  6. {
  7. Console.WriteLine(i.ToString());
  8. }

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:

Listing 9
  1. var list = new List<int>();
  2. int[] t = {10, 20, 30, 30, 40};
  3. list.AddRange(t);
  4. list.RemoveRange(3, 2);
  5. foreach(int i in list)
  6. {
  7. Console.WriteLine(i.ToString());
  8. }

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:

Listing 10
  1. static bool LessThenTen(int t)
  2. {
  3. return t < 10;
  4. }

A teraz usuwanie wszystkich elementów z kontenera mniejszych od 10-ciu przy pomocy metody RemoveAll:

Listing 11
  1. var list = new List<int>();
  2. int[] t = {-10, 0, 10, 20, 30};
  3. list.AddRange(t);
  4. list.RemoveAll(LessThenTen);
  5. foreach(int i in list)
  6. {
  7. Console.WriteLine(i.ToString());
  8. }

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:

Listing 12
  1. var list = new List<int>();
  2. int[] t = {1, 2, 3, 4, 5};
  3. list.AddRange(t);
  4. list.Reverse();
  5. foreach(int i in list)
  6. {
  7. Console.WriteLine(i.ToString());
  8. }

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:

Listing 13
  1. var list = new List<int>();
  2. int[] t = {4, 1, 3, 2, 5};
  3. list.AddRange(t);
  4. list.Sort();
  5. foreach(int i in list)
  6. {
  7. Console.WriteLine(i.ToString());
  8. }

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:

Listing 14
  1. static int FromMaxToMin(int a, int b)
  2. {
  3. return b - a;
  4. }

A oto i przykład zastosowania w praktyce powyższej metody do sortowania kontenera zwierającego elementy typu int:

Listing 15
  1. var list = new List<int>();
  2. int[] t = {4, 1, 3, 2, 5};
  3. list.AddRange(t);
  4. list.Sort(FromMaxToMin);
  5. foreach(int i in list)
  6. {
  7. Console.WriteLine(i.ToString());
  8. }

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:

Listing 16
  1. var list = new List<int>();
  2. int[] t = {1, 2, 3, 4, 5};
  3. list.AddRange(t);
  4. int[] t2 = list.ToArray();
  5. foreach(int i in t2)
  6. {
  7. Console.WriteLine(i.ToString());
  8. }

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:

Listing 17
  1. var list = new List<int>();
  2. int[] t = {1, 2, 3, 4, 5};
  3. list.AddRange(t);
  4. list[2] = 4;
  5. foreach(int i in t2)
  6. {
  7. Console.WriteLine(i.ToString());
  8. }
  9. 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:

Listing 18
  1. var list = new List<int>();
  2. int[] t = {1, 2, 3, 4, 5};
  3. list.AddRange(t);
  4. Console.WriteLine(list.Sum());

Wynik działania powyższego kodu:

15

Dla prostej klasy Point2D:

Listing 19
  1. public class Point2D{
  2. public double x;
  3. public double y;
  4. public Point2D(double x, double y)
  5. {
  6. this.x = x;
  7. this.y = y;
  8. }
  9. };

Można wykonać sumowanie poszczególnych jej pól w sposób następujący:

Listing 20
  1. var p2dlist = new List<Point2D>();
  2. p2dlist.Add(new Point2D(20, 30));
  3. p2dlist.Add(new Point2D(100, 400));
  4. double x_sum = p2dlist.Sum(pkg => pkg.X);
  5. Console.WriteLine(x_sum);
  6. double y_sum = p2dlist.Sum(pkg => pkg.Y);
  7. 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:

Listing 21
  1. var list = new List<int>();
  2. int[] t = {20, 40, 5, 23, 100, -20, 0};
  3. list.AddRange(t);
  4. 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:

Listing 22
  1. var list = new List<int>();
  2. int[] t = {20, 40, 5, 23, 100, -20, 0};
  3. list.AddRange(t);
  4. Console.WriteLine("Minimalna wartość w kontenerze: " + list.Min());

Wynik działania powyższego kodu:

Minimalna wartość w kontenerze: -20

Komentarze