Dowiedz się, jak zarządzać zbieraniami danych przy użyciu listy<T> w języku C#

Ten samouczek wprowadzający zawiera wprowadzenie do języka C# i podstawy List<T> klasy.

Wymagania wstępne

Samouczek oczekuje, że masz maszynę skonfigurowaną na potrzeby programowania lokalnego. Zobacz Konfigurowanie środowiska lokalnego , aby uzyskać instrukcje instalacji i omówienie tworzenia aplikacji na platformie .NET.

Jeśli wolisz uruchomić kod bez konieczności konfigurowania środowiska lokalnego, zobacz interaktywną wersję tego samouczka w przeglądarce.

Podstawowy przykład listy

Utwórz katalog o nazwie list-tutorial. Upewnij się, że bieżący katalog i uruchom polecenie dotnet new console.

Ważne

Szablony języka C# dla platformy .NET 6 używają instrukcji najwyższego poziomu. Aplikacja może nie być zgodna z kodem w tym artykule, jeśli została już uaktualniona do platformy .NET 6. Aby uzyskać więcej informacji, zobacz artykuł dotyczący nowych szablonów języka C# generowania instrukcji najwyższego poziomu

Zestaw SDK platformy .NET 6 dodaje również zestaw niejawnychglobal using dyrektyw dla projektów korzystających z następujących zestawów SDK:

  • Microsoft.NET.Sdk
  • Microsoft.NET.Sdk.Web
  • Microsoft.NET.Sdk.Worker

Te niejawne global using dyrektywy obejmują najbardziej typowe przestrzenie nazw dla typu projektu.

Aby uzyskać więcej informacji, zobacz artykuł dotyczący niejawnych dyrektyw using

Otwórz plik Program.cs w ulubionym edytorze i zastąp istniejący kod następującym kodem:

List<string> names = ["<name>", "Ana", "Felipe"];
foreach (var name in names)
{
    Console.WriteLine($"Hello {name.ToUpper()}!");
}

Zastąp <name> ciąg swoim imieniem i nazwiskiem. Zapisz plik Program.cs. Wpisz dotnet run polecenie w oknie konsoli, aby go wypróbować.

Utworzono listę ciągów, dodano trzy nazwy do tej listy i wydrukowano nazwy we wszystkich capS. Używasz pojęć, które zostały poznane we wcześniejszych samouczkach, aby przechodzić w pętli na liście.

Kod do wyświetlania nazw korzysta z funkcji interpolacji ciągów . Po zakończeniu string$ znaku można osadzić kod języka C# w deklaracji ciągu. Rzeczywisty ciąg zastępuje ten kod języka C# wartością, którą generuje. W tym przykładzie zastępuje {name.ToUpper()} wartość każdą nazwą, przekonwertowaną na wielkie litery, ponieważ została wywołana ToUpper metoda .

Kontynuujmy eksplorowanie.

Modyfikowanie zawartości listy

Utworzona kolekcja używa List<T> typu . Ten typ przechowuje sekwencje elementów. Należy określić typ elementów między nawiasami kątowymi.

Ważnym aspektem tego List<T> typu jest to, że może rosnąć lub zmniejszać, umożliwiając dodawanie lub usuwanie elementów. Dodaj ten kod na końcu programu:

Console.WriteLine();
names.Add("Maria");
names.Add("Bill");
names.Remove("Ana");
foreach (var name in names)
{
    Console.WriteLine($"Hello {name.ToUpper()}!");
}

Na końcu listy dodano jeszcze dwie nazwy. Usunięto również jedną z nich. Zapisz plik i wpisz dotnet run , aby go wypróbować.

Element List<T> umożliwia również odwoływanie się do poszczególnych elementów według indeksu . Indeks między tokenami [ i jest ] umieszczany zgodnie z nazwą listy. Język C# używa liczby 0 dla pierwszego indeksu. Dodaj ten kod bezpośrednio pod właśnie dodanym kodem i wypróbuj go:

Console.WriteLine($"My name is {names[0]}");
Console.WriteLine($"I've added {names[2]} and {names[3]} to the list");

Nie można uzyskać dostępu do indeksu poza końcem listy. Pamiętaj, że indeksy zaczynają się od 0, więc największy prawidłowy indeks jest mniejszy niż liczba elementów na liście. Możesz sprawdzić, jak długo lista używa Count właściwości . Dodaj następujący kod na końcu programu:

Console.WriteLine($"The list has {names.Count} people in it");

Zapisz plik i wpisz dotnet run ponownie, aby wyświetlić wyniki.

Wyszukiwanie i sortowanie list

Nasze przykłady używają stosunkowo małych list, ale aplikacje mogą często tworzyć listy z wieloma większą liczbą elementów, czasami numerując w tysiącach. Aby znaleźć elementy w tych większych kolekcjach, należy wyszukać na liście różne elementy. Metoda IndexOf wyszukuje element i zwraca indeks elementu. Jeśli element nie znajduje się na liście, IndexOf zwraca wartość -1. Dodaj ten kod w dolnej części programu:

var index = names.IndexOf("Felipe");
if (index == -1)
{
    Console.WriteLine($"When an item is not found, IndexOf returns {index}");
}
else
{
    Console.WriteLine($"The name {names[index]} is at index {index}");
}

index = names.IndexOf("Not Found");
if (index == -1)
{
    Console.WriteLine($"When an item is not found, IndexOf returns {index}");
}
else
{
    Console.WriteLine($"The name {names[index]} is at index {index}");

}

Elementy na liście można również sortować. Metoda Sort sortuje wszystkie elementy na liście w ich normalnej kolejności (alfabetycznie dla ciągów). Dodaj ten kod w dolnej części programu:

names.Sort();
foreach (var name in names)
{
    Console.WriteLine($"Hello {name.ToUpper()}!");
}

Zapisz plik i wpisz dotnet run , aby wypróbować tę najnowszą wersję.

Przed rozpoczęciem następnej sekcji przenieśmy bieżący kod do oddzielnej metody. Ułatwia to rozpoczęcie pracy z nowym przykładem. Umieść cały kod napisany w nowej metodzie o nazwie WorkWithStrings(). Wywołaj tę metodę w górnej części programu. Po zakończeniu kod powinien wyglądać następująco:

WorkWithStrings();

void WorkWithStrings()
{
    List<string> names = ["<name>", "Ana", "Felipe"];
    foreach (var name in names)
    {
        Console.WriteLine($"Hello {name.ToUpper()}!");
    }

    Console.WriteLine();
    names.Add("Maria");
    names.Add("Bill");
    names.Remove("Ana");
    foreach (var name in names)
    {
        Console.WriteLine($"Hello {name.ToUpper()}!");
    }

    Console.WriteLine($"My name is {names[0]}");
    Console.WriteLine($"I've added {names[2]} and {names[3]} to the list");

    Console.WriteLine($"The list has {names.Count} people in it");

    var index = names.IndexOf("Felipe");
    if (index == -1)
    {
        Console.WriteLine($"When an item is not found, IndexOf returns {index}");
    }
    else
    {
        Console.WriteLine($"The name {names[index]} is at index {index}");
    }

    index = names.IndexOf("Not Found");
    if (index == -1)
    {
        Console.WriteLine($"When an item is not found, IndexOf returns {index}");
    }
    else
    {
        Console.WriteLine($"The name {names[index]} is at index {index}");

    }

    names.Sort();
    foreach (var name in names)
    {
        Console.WriteLine($"Hello {name.ToUpper()}!");
    }
}

Listy innych typów

Do tej pory używano string typu na listach. Utwórzmy List<T> inny typ. Skompilujmy zestaw liczb.

Dodaj następujące elementy do programu po wywołaniu polecenia WorkWithStrings():

List<int> fibonacciNumbers = [1, 1];

Spowoduje to utworzenie listy liczb całkowitych i ustawienie pierwszych dwóch liczb całkowitych na wartość 1. Są to dwie pierwsze wartości sekwencji Fibonacciego, czyli sekwencja liczb. Każda następna liczba Fibonacciego zostanie znaleziona przez pobranie sumy dwóch poprzednich liczb. Dodaj ten kod:

var previous = fibonacciNumbers[fibonacciNumbers.Count - 1];
var previous2 = fibonacciNumbers[fibonacciNumbers.Count - 2];

fibonacciNumbers.Add(previous + previous2);

foreach (var item in fibonacciNumbers)
{
    Console.WriteLine(item);
}

Zapisz plik i wpisz dotnet run , aby wyświetlić wyniki.

Porada

Aby skoncentrować się tylko na tej sekcji, możesz oznaczyć jako komentarz kod, który wywołuje metodę WorkWithStrings();. Wystarczy umieścić dwa / znaki przed wywołaniem w następujący sposób: // WorkWithStrings();.

Zadanie

Sprawdź, czy możesz zebrać niektóre koncepcje z tej i wcześniejszych lekcji. Rozwiń to, co zostało utworzone do tej pory, korzystając z liczb Fibonacciego. Spróbuj napisać kod, aby wygenerować pierwsze 20 liczb w sekwencji. (Podpowiadamy, że 20. liczba Fibonacciego wynosi 6765).

Ukończenie wyzwania

Przykładowe rozwiązanie można zobaczyć , przeglądając gotowy przykładowy kod w witrynie GitHub.

Przy każdej iteracji pętli przyjmujesz dwie ostatnie liczby całkowite na liście, sumując je i dodając tę wartość do listy. Pętla powtarza się do momentu dodania 20 elementów do listy.

Gratulacje, ukończono samouczek dotyczący listy. Możesz kontynuować korzystanie z dodatkowych samouczków we własnym środowisku projektowym.

Więcej informacji na temat pracy z typem List można dowiedzieć się w artykule podstaw platformy .NET dotyczącym kolekcji. Poznasz również wiele innych typów kolekcji.