Zrozumienie Listy w C#
[[academy-video-youtube({"vid": "3_rlZKJoFPs", "start_time": "0", "title": "Understanding C# List", "creator": "Layla Porter", "length": "14m 6s"})]]
Klasa List w C#, która jest wszechstronnym typem kolekcji. Jest oparta na dynamicznej tablicy jako wewnętrznej strukturze danych, co pozwala na efektywne manipulowanie elementami. Podczas tworzenia Listy można określić domyślną początkową pojemność, aby zoptymalizować użycie pamięci od samego początku. Ta pojemność to liczba elementów, które lista może początkowo przechowywać bez realokacji pamięci.
W filmie Layli Porter "C# for Beginners Part 7 - Querying Data with LINQ", zagłębia się ona w funkcjonalność list C# pokazując, jak efektywnie wykorzystywać LINQ (Język zapytań zintegrowany) do zapytań danych. Niniejszy artykuł wyjaśnia kluczowe pojęcia i przykłady z filmu Layli, oferując kompleksowe zrozumienie list C# dla początkujących.
Wprowadzenie do list w C
Jak Layla wspomina na początku swojego filmu (0:03), lista w C# jest wszechstronną strukturą danych, która pozwala programistom przechowywać i manipulować kolekcją elementów. W przeciwieństwie do tablic, listy mogą dynamicznie zmieniać rozmiar, co sprawia, że są idealne do sytuacji, gdy liczba elementów nie jest znana z góry.
Użycie Listy jest proste. Można dodawać do niej elementy za pomocą metody Add, która dołącza określony obiekt na końcu listy. Lista używa indeksu zerowego, co oznacza, że pierwszy element jest dostępny pod indeksem 0. Można również uzyskać dostęp do elementów za pomocą określonego indeksu korzystając z notacji kwadratowych nawiasów ([]).
Aby przechodzić przez listę, można użyć pętli foreach, która przechodzi przez każdy element w kolejności, w jakiej się pojawiają. Jeśli trzeba znaleźć pierwsze wystąpienie określonego elementu, można użyć metod takich jak IndexOf z predykatem, która przeszukuje na podstawie określonego warunku.
Lista jest silnie typowana, co oznacza, że przechowuje obiekty określonego typu (T). Zapewnia to bezpieczeństwo typów i umożliwia korzystanie z metod i właściwości zdefiniowanych przez określony typ obiektu. Domyślnie Lista używa domyślnej funkcji skrótu, aby efektywnie organizować elementy.
Przyjrzyjmy się bliżej działaniu Listy i metodom klasy List, jak pokazano w filmie Layli.
Tworzenie Listy
Podczas tworzenia listy w C#, można ustawić określoną początkową pojemność, aby zoptymalizować wewnętrzną strukturę danych. Listy są wszechstronne i mogą być inicjalizowane z określonej kolekcji elementów. Można uzyskiwać dostęp do elementów przy użyciu indeksu int i iterować przez nie za pomocą pętli foreach. W przeciwieństwie do słowników, listy nie polegają na domyślnej funkcji skrótu, a przechowują silnie typowane obiekty, zapewniając bezpieczeństwo typów i spójność w zarządzaniu danymi.
W (0:44) Layla tworzy listę serów, ilustrując jak inicjalizować i wypełniać listę. W C# listę można utworzyć za pomocą klasy List, gdzie T reprezentuje typ elementów zawartych w liście.
List<Cheese> cheeseList = new List<Cheese>
{
new Cheese(1, "Stilton", 3.0m, 5),
new Cheese(2, "Cheddar", 2.25m, 3),
new Cheese(3, "Pineapple", 3.5m, 1),
new Cheese(4, "Brie", 5.5m, 2),
new Cheese(5, "Roquefort", 3.5m, 5),
};List<Cheese> cheeseList = new List<Cheese>
{
new Cheese(1, "Stilton", 3.0m, 5),
new Cheese(2, "Cheddar", 2.25m, 3),
new Cheese(3, "Pineapple", 3.5m, 1),
new Cheese(4, "Brie", 5.5m, 2),
new Cheese(5, "Roquefort", 3.5m, 5),
};W powyższym przykładzie, Layla tworzy List<Cheese> używając składni inicjalizatora kolekcji, aby zdefiniować i wypełnić listę obiektami Cheese. Specyfikuje ona properties takie jak ID, nazwa, cena i siła dla każdego obiektu sera, co odpowiada klasie Cheese, demonstrując tworzenie i inicjalizację listy w C#.
Iteracja po Liście Serów w celu Drukowania ID i Nazwy
Layla Porter demonstruje, jak używać pętli foreach do iteracji po cheeseList i drukowania tylko ID i nazwy każdego sera. Poniżej znajduje się kod wraz z wyjaśnieniem:
foreach (var cheese in cheeseList)
{
Console.WriteLine($"ID: {cheese.ID}, Name: {cheese.Name}");
}foreach (var cheese in cheeseList)
{
Console.WriteLine($"ID: {cheese.ID}, Name: {cheese.Name}");
}W powyższym kodzie, Layla używa pętli foreach, aby przeglądać cheeseList. To drukuje wszystkie elementy listy. Pętla iteruje przez każdy obiekt Cheese na liście. W każdej iteracji zmienna cheese przechowuje bieżący obiekt Cheese w określonym indeksie. Używając Console.WriteLine, drukuje właściwości ID i nazwy każdego elementu sera, pokazując, jak uzyskać dostęp i wyświetlać określone elementy z listy w C#.
Wyszukiwanie Serów Za Pomocą Zapytania LINQ
W wideo o 2:45, Layla Porter pokazuje, jak wyszukiwać określony ser na podstawie danych wejściowych użytkownika za pomocą LINQ. Używa metody ReadLine, aby uzyskać nazwę sera od użytkownika:
string cheeseName = Console.ReadLine();string cheeseName = Console.ReadLine();Podczas wyszukiwania elementu na Liście, Layla zwraca uwagę na bardzo ważną kwestię o 2:51. Mówi, że gdybyśmy nie używali LINQ, musielibyśmy ręcznie iterować przez każdy ser w naszej kolekcji, aby znaleźć nazwę pasującą do danych wejściowych użytkownika, ale biblioteki pomocnicze LINQ radzą sobie z tym za kulisami, co czyni ten proces bardzo efektywnym. Ponizszy fragment kodu ilustruje, jak Layla (3:40) iteruje po elementach listy bez uzycia petli for, wykorzystujac jedynie skladnie zapytan LINQ:
if (cheeseList.Any(cheese => cheese.Name == cheeseName))
{
Cheese cheese = cheeseList.FirstOrDefault(c => c.Name == cheeseName);
Console.WriteLine($"{cheese.Name} cheese costs £{cheese.Price.ToString()} and has a strength of {cheese.Strength}.");
}
else
{
Console.WriteLine("I'm sorry, we don't have that cheese.");
}if (cheeseList.Any(cheese => cheese.Name == cheeseName))
{
Cheese cheese = cheeseList.FirstOrDefault(c => c.Name == cheeseName);
Console.WriteLine($"{cheese.Name} cheese costs £{cheese.Price.ToString()} and has a strength of {cheese.Strength}.");
}
else
{
Console.WriteLine("I'm sorry, we don't have that cheese.");
}W powyższym kodzie:
Layla wyjaśnia, że zamiast ręcznego przeglądania listy, możemy użyć LINQ do bardziej efektywnego wyszukiwania. Metoda
Anysprawdza, czy jakikolwiek ser na liście pasuje do wprowadzonej przez użytkownika nazwy.Jeśli znaleziono dopasowanie, oznacza to, że element istnieje, metoda
FirstOrDefaultpobiera pierwszy ser, który pasuje do wprowadzonej nazwy. Ta metoda jest bezpieczna, ponieważ zwraca null, jeśli nie zostanie znalezione żadne dopasowanie, zapobiegając potencjalnym błędom.- Jeśli ser jest znaleziony, drukowana jest jego Nazwa, Cena i Siła. Jeśli nie, wyświetlany jest komunikat wskazujący, że ser nie został znaleziony.
To podejście pokazuje efektywność i prostotę użycia LINQ do wyszukiwania w kolekcjach w C#. Wynik fragmentu kodu jest pokazany o 7:19: (Czy możliwa jest lepsza jakość obrazu niż poniższa?)

Obsługa Wrażliwości Na Wielkość Liter Podczas Wyszukiwania
Pracując z ciągami, Layla o 8:00 przypomina, że ważne jest, aby pamiętać, że są one czułe na wielkość liter. Aby upewnić się, że porównania nazw serów są niewrażliwe na wielkość liter, musimy zamienić zarówno dane wprowadzone przez użytkownika, jak i nazwy serów w naszej liście na małe litery za pomocą metody .ToLower(). Pozwala to użytkownikowi na wprowadzenie dowolnego rodzaju kapitalizacji, a nasz kod nadal prawidłowo znajdzie pasujący ser. Wystarczy pamiętać, że wrażliwość na wielkość liter może być uciążliwa, więc jej odpowiednie przetwarzanie jest kluczowe.
Praktyczny Przykład: Zapytania Serów Przy Użyciu Siły
O 8:50 Layla tworzy praktyczny przykład, w którym użytkownik może filtrować sery według ich siły, pokazując, jak połączyć dane wejściowe użytkownika z zapytaniami LINQ.
1. Zachęta Do Wprowadzenia Danych I Ich Odczytanie
Console.WriteLine("What strength cheese are you interested in - choose between 1 and 5");
string strengthString = Console.ReadLine();Console.WriteLine("What strength cheese are you interested in - choose between 1 and 5");
string strengthString = Console.ReadLine();Layla o 9:05 zaczyna od poproszenia użytkownika o wybór wartości siły pomiędzy 1 a 5. To jest zrobione prostym Console.WriteLine proszącym o dane wejściowe, a następnie Console.ReadLine(), aby pobrać to, co wpiszą.
2. Konwersja Danych Wejściowych Na Liczbę Całkowitą
bool isInt = int.TryParse(strengthString, out int strength);bool isInt = int.TryParse(strengthString, out int strength);Następnie, o 9:16 upewnia się, że ich dane wejściowe to faktyczna liczba. Zaleca użycie int.TryParse do tego celu. Jeśli dane wejściowe się sprawdzą i zostaną pomyślnie skonwertowane na liczbę całkowitą, świetnie! Jeśli nie, cóż, możemy sobie z tym poradzić łagodnie.
3. Filtrowanie Serów Według Siły
List<Cheese> cheeseByStrength = cheeseList.Where(c => c.Strength == strength).ToList();List<Cheese> cheeseByStrength = cheeseList.Where(c => c.Strength == strength).ToList();Teraz nadchodzi zabawna część wideo Layli o 10:25. Tutaj pokazuje, jak filtrować naszą listę serów, tj. cheeseList za pomocą LINQ. Za pomocą metody Where LINQ i szybkiego wyrażenia lambda (c => c.Strength == strength), uzyskuje tylko sery, które pasują do wybranej przez użytkownika siły. To daje nam nową listę, cheeseByStrength.
4. Wyjście Filtrowanych Serów
foreach (var cheese in cheeseByStrength)
{
Console.WriteLine($"Name: {cheese.Name} cheese");
}foreach (var cheese in cheeseByStrength)
{
Console.WriteLine($"Name: {cheese.Name} cheese");
}Na koniec o 12:03, aby wszystko ładnie zakończyć, Layla przechodzi przez cheeseByStrength za pomocą pętli foreach. Dla każdego sera na tej liście wypisuje jego nazwę używając określonego predykatu w Console.WriteLine. Proste i skuteczne!
Podczas wykonywania programu o 12:17, Layla pokazuje, jak użytkownik wprowadza wartość siły, a lista jest filtrowana, aby wyświetlić tylko sery o określonej sile. Przykładowe wyjście pokazano poniżej: (Możliwe lepsze zdjęcie?)

Wnioski
Film Layli skutecznie wprowadza koncepcję list C# i jak je zapytać za pomocą LINQ. Postępując według jej przykładów i wyjaśnień, początkujący mogą uzyskać solidne podstawy w pracy z listami i zapytaniami danych w C#. Po więcej szczegółów i sesji kodowania na żywo, odwiedź ten kanał Layli na YouTube i dołącz do jej transmisji na żywo.
Pamiętaj, aby eksplorować różne metody i właściwości klasy List, takie jak właściwość Count, metoda Insert, funkcje predykatów i więcej, aby zwiększyć swoje zrozumienie i umiejętność manipulowania listami efektywnie.



