Zrozumienie tablic w C#
Tablice w C# są fundamentalną strukturą danych, która umożliwia programistom przechowywanie zbioru elementów tego samego typu w ciągłych lokalizacjach w pamięci. Tablice mogą być jednowymiarowe, wielowymiarowe lub zagnieżdżone.
Ten artykuł o tablicach w C# jest inspirowany edukacyjnym wideo Layli Porter, "C# dla początkujących Część 5 - Tablice i więcej pętli." W swoim wideo Layla wyjaśnia podstawy tablic i wprowadza więcej technik pętli w C#, wyposażając widzów w niezbędne umiejętności do efektywnego zarządzania kolekcjami i przechodzenia przez dane.
Rozumienie Tablic
Layla zaczyna od wyjaśnienia tablic jako kolekcji o stałej długości w C#. W przeciwieństwie do niektórych innych języków programowania, w których tablice mogą zmieniać rozmiar dynamicznie, tablice w C# są niezmienne po utworzeniu. Oznacza to, że ich rozmiar nie może być zmieniony po inicjalizacji z powodu ograniczeń przydziału pamięci.
Prosta interakcja z konsolą: Wybór ulubionego sera
W poniższym kodzie, w przeciwieństwie do tablic, Layla (1:50) najpierw demonstruje, jak użytkownik może zostać przedstawiony z listą elementów, z której może wybrać.
Console.WriteLine("Hello, what is your favourite cheese from this list?");
Console.WriteLine("1. Stilton");
Console.WriteLine("2. Cheddar");
Console.WriteLine("3. Pineapple");
Console.WriteLine("4. Brie");
var favouriteCheese = Console.ReadLine();
Console.WriteLine($"Here is a lump of {favouriteCheese} cheese!");
Console.WriteLine("Hello, what is your favourite cheese from this list?");
Console.WriteLine("1. Stilton");
Console.WriteLine("2. Cheddar");
Console.WriteLine("3. Pineapple");
Console.WriteLine("4. Brie");
var favouriteCheese = Console.ReadLine();
Console.WriteLine($"Here is a lump of {favouriteCheese} cheese!");
Ten kod najpierw używa Console.WriteLine, aby wydrukować wiadomość w konsoli, która pyta użytkownika, jaki jest jego ulubiony ser. Następnie używa Console.WriteLine cztery razy, aby wydrukować listę serów w konsoli. Kod następnie używa Console.ReadLine, aby odczytać dane wejściowe użytkownika z konsoli i przechowuje je w zmiennej favouriteCheese. Na koniec kod używa ponownie Console.WriteLine, aby wydrukować wiadomość w konsoli, która zawiera ulubiony ser użytkownika.
Layla, w 2:04, wykonuje ten kod, aby pokazać, jak to działa:

Deklaracja tablicy - Inicjalizacja tablicy
Na początek Layla demonstruje, jak zadeklarować i zainicjalizować tablicę łańcuchów, w tym przypadku listę serów, które były pierwotnie prezentowane użytkownikowi jako menu. Przedstawia składnię definiowania jednowymiarowej tablicy (2:30) i wypełniania jej początkowymi wartościami za pomocą nawiasów klamrowych (2:54).
string[] cheeses = { "Brie", "Cheddar", "Stilton", "Gouda" };
string[] cheeses = { "Brie", "Cheddar", "Stilton", "Gouda" };
Podkreśla znaczenie indeksowania zaczynającego od zera w tablicach, gdzie pierwszy element w jednowymiarowej tablicy jest dostępny przy użyciu indeksu 0. Następnie Layla pokazuje, jak iterować po tablicach, używając pętli for. Ta struktura pętli jest kluczowa w programowaniu, ponieważ pozwala na wielokrotne wykonywanie kodu na podstawie określonego warunku.
Implementacja Pętli
Przechodząc do pętli, Layla wprowadza pętlę for z jej trzema niezbędnymi składnikami: inicjalizatorem, warunkiem i iteratorem. Ta pętla jest używana do iteracji po elementach tablicy na podstawie jej długości.
for (int i = 0; i < cheeses.Length; i++)
{
Console.WriteLine(cheeses[i]);
}
for (int i = 0; i < cheeses.Length; i++)
{
Console.WriteLine(cheeses[i]);
}
Podkreśla, że cheeses.Length zwraca liczbę elementów w tablicy, co gwarantuje, że pętla iteruje precyzyjnie przez każdy element. Zmienna i działa jako zmienna indeksu do iteracji po indeksach. To skutecznie wypisuje pojedyncze elementy tablicy bez kilkukrotnego pisania metody Console.WriteLine, jak pokazano powyżej, bez dostępu do elementów tablicy. Layla, w 6:17, uruchamia aplikację, aby pokazać, że wynik tej pętli for jest dokładnie taki sam jak w poprzednim przykładzie:

Porządkowanie i Niezmienność
Layla wyjaśnia zaletę porządkowania, a następnie o 7:17 demonstruje sortowanie tablicy alfabetycznie, używając metody Sort, ostrzegając, że sortowanie tak naprawdę tworzy nową tablicę za kulisami z powodu niezmienności tablic w C#. Jest to kluczowy punkt do zrozumieniuiuiuiuia, jak manipulacja danymi wpływa na pamięć i wydajność.
Array.Sort(cheeses);
Array.Sort(cheeses);
Pokazuje również, jak poszczególne elementy w tablicy mogą być modyfikowane bezpośrednio bez tworzenia nowej tablicy (8:10), ilustrując zmienność w niezmienności. Indeks elementu do zamiany jest podawany w nawiasach kwadratowych po zmiennej tablicy cheeses:
cheeses[0] = "Roquefort";
cheeses[0] = "Roquefort";
To zastąpi element tablicy "Brie" na indeksie 0 nową wartością "Roquefort".
Aktualizacja Listy Serów: Obsługa nowych wpisów (8:46)
Layla wyjaśnia, jak możemy dodawać wartości do istniejącej listy. Obejmuje to pobranie istniejących wartości i nowej wartości, utworzenie nowej tablicy, która zawiera oba i zaktualizowanie naszego odwołania, aby wskazywała na tę nową tablicę. Poniższy kod pokazuje, jak to działa:
var favouriteCheese = Console.ReadLine();
bool containsFavourite = false;
foreach (var cheese in cheeses)
{
if (favouriteCheese == cheese)
{
containsFavourite = true;
}
}
if (!containsFavourite)
{
cheeses = cheeses.Append(favouriteCheese).ToArray();
}
var favouriteCheese = Console.ReadLine();
bool containsFavourite = false;
foreach (var cheese in cheeses)
{
if (favouriteCheese == cheese)
{
containsFavourite = true;
}
}
if (!containsFavourite)
{
cheeses = cheeses.Append(favouriteCheese).ToArray();
}
Ten przykład pokazuje ten proces w prosty sposób z wykorzystaniem podstawowych operacji na tablicach i pętli foreach, aby sprawdzić, czy ser jest już na liście. Jeśli nie, Layla dodaje go (13:33) do tablicy, używając metody Append z System.Linq.
Layla, w 13:50, mówi, że kod zawiera błędy, ponieważ cheeses i rezultat Append to różne typy. Append zwraca IEnumerable, interfejs dla kolekcji. Aby to naprawić, konwertujemy IEnumerable na tablicę, używając metody ToArray(), a następnie przypisujemy ją z powrotem do cheeses. Layla zauważa, że żółta falista linia to ostrzeżenie kompilatora wskazujące na potencjalne problemy, takie jak to, że favouriteCheese jest null, ale pomijamy kontrole bezpieczeństwa w tym demo.
Aktualizacja i Drukowanie Listy Serów
Layla wyjaśnia, że kiedy dodamy nowy element do naszej tablicy, powinniśmy wydrukować zaktualizowaną listę na ekranie. Aby to osiągnąć, używamy pętli for, drukując każdy element wraz z jego indeksem, aby pokazać, że tablica zawiera teraz więcej elementów.
Console.WriteLine("The new list:");
for (var i = 0; i < cheeses.Length; i++)
{
Console.WriteLine(i + " " + cheeses[i]);
}
Console.WriteLine($"Here is a lump of {favouriteCheese} cheese!");
Console.WriteLine("The new list:");
for (var i = 0; i < cheeses.Length; i++)
{
Console.WriteLine(i + " " + cheeses[i]);
}
Console.WriteLine($"Here is a lump of {favouriteCheese} cheese!");
Pokazuje to dynamiczną naturę tablic w C#, pokazując, jak dodawać nowe elementy i weryfikować aktualizację poprzez drukowanie zawartości tablicy.
Layla następnie uruchamia aplikację, aby wyświetlić nowo dodany ser (15:19):

Wzbogacenie z tablicami obiektów
Aby poszerzyć rozumienie, Layla wprowadza tablice obiektów, tworząc klasę Cheese z właściwościami dla Name i Strength (16:14). Następnie zastępuje listę łańcuchów, aby stworzyć tablicę obiektów Cheese i demonstruje, jak uzyskiwać dostęp do właściwości w ramach iteracji (17:46).
class Cheese
{
public string Name { get; set; }
public int Strength { get; set; }
public Cheese(string name, int strength)
{
Name = name;
Strength = strength;
}
}
Cheese[] cheeses = new Cheese[]
{
new Cheese("Stilton", 3),
new Cheese("Cheddar", 2),
new Cheese("Pineapple", 1),
new Cheese("Brie", 2)
};
cheeses[0] = new Cheese("Roquefort", 4);
class Cheese
{
public string Name { get; set; }
public int Strength { get; set; }
public Cheese(string name, int strength)
{
Name = name;
Strength = strength;
}
}
Cheese[] cheeses = new Cheese[]
{
new Cheese("Stilton", 3),
new Cheese("Cheddar", 2),
new Cheese("Pineapple", 1),
new Cheese("Brie", 2)
};
cheeses[0] = new Cheese("Roquefort", 4);
Ten segment zapewnia podstawowe zrozumieniuiuiuiuie, jak tablice mogą kapsułkować złożone struktury danych, oferując elastyczność i moc w programowaniu.
Wykorzystanie obiektu ser w pętlach
Layla teraz pokazuje, jak drukować wszystkie elementy zaktualizowanej listy na ekranie. W tym scenariuszu każdy ser reprezentowany jest jako obiekt z właściwościami Name i Strength. Pętla for iteruje przez tę tablicę obiektów Cheese, gdzie każda iteracja obsługuje bezpośrednio jeden element tablicy.
for (int i = 0; i < cheeses.Length; i++)
{
Console.WriteLine($"{cheeses[i].Name}, Strength: {cheeses[i].Strength}");
}
for (int i = 0; i < cheeses.Length; i++)
{
Console.WriteLine($"{cheeses[i].Name}, Strength: {cheeses[i].Strength}");
}
Ta pętla upraszcza dostęp do właściwości obiektów Cheese przechowywanych w tablicy cheeses. Layla, w 20:34, uruchamia program i wynik jest następujący:

Wnioski
Podsumowując, samouczek Layli Porter na temat tablic i pętli w C# zapewnia solidną podstawę dla początkujących, aby zrozumieć te istotne koncepcje. Dzięki opanowaniu tablic i różnych konstrukcji pętli, aspirujący deweloperzy C# mogą efektywnie manipulować strukturami danych i iterować przez kolekcje w swoich programach. Zrozumienie tych podstaw jest kluczowe do budowania bardziej skomplikówanych aplikacji i dalszego eksplorowania aspektów programowania w C#.
Podążając za przykładami i objaśnieniami Layli, początkujący mogą nabrać pewności w efektywnym używaniu tablic i pętli w swoich projektach C#. Aby uzyskać bardziej dogłębną wiedzę o kolekcjach C# i zaawansowanych tablicach dwuwymiarowych i zagnieżdżonych, uczniowie są zachęcani do eksplorowania kolejnych samouczków i praktycznych ćwiczeń.



