# C# in the Nutshell: Kolekcje i LINQ
## Kolekcje
### Lista
Jest to zbiór obiektów danego typu. Korzystamy z niej, aby operować na wielu elementach danego typu jednocześnie.
```csharp=
public List<Character> Characters { get; set; }
```
```csharp=
Characters = new List<Character> {
new Character
{
Name = "Snnoking",
Dmg = 4,
Hp = 14
},
new Character
{
Name = "Huzdy",
Dmg = 5,
Hp = 11
}
};
```
Przykładowe opearcje na listach:
* `Add()` - dodaje element do listy
* `Reverse()` - odwraca kolejność elementów listy
* `Clear()` - czyści zawartość listy
* `FindIndex()` - zwraca indeks elementu, spełniającego warunek podany w ( )
#### Iteracja po listach
```csharp=
foreach (Character character in dataContext.Characters)
{
character.Introduce();
}
```
> Pętlę foreach można szybko zapisać za pomocą `fore` i dwukrotnego naciśnięcia tab
## Konstruktor
Podstawowa metoda klasy, która tworzy jej obiekt. Pozwala na łatwiejsze stworzenie danych (no i klika innych rzeczy, ale to później)
```csharp=
public DataContext()
{
}
```
Konstruktor, jak każda inna metoda, może mieć swoje argumenty:
```csharp=
public DataContext(string name)
{
Characters = new List<Character>()
{
new Character()
{
Name = name,
Dmg = 4,
Hp = 10
}
}
}
```
> `ctor` pozwala na łatwiejsze utworzenie konstruktora
### operator `new`
Jest to operator, który mówi że chcemy utworzyć nowy obiekt danej klasy.
```csharp=
Character character = new Character();
```
## Komentarze
```csharp=
/*
Komentarz blokowy
*/
```
```csharp=
// komentarz w jednej linii
```
Komentarze są częścią kodu, widoczną tylko dla programisty, a pomijaną przez kompilator.
> W Visualu można skomentować fragment kodu za pomocą skrótu`Ctrl+K, Ctrl+C` \
> Możemy odkomentować fragment za pomocą skrótu `Ctrl+K, Ctrl+U`
## Wyrażenie lambda
Jest to funkcja anonimowa, czyli w dużym uproszczeniu funkcja bez nazwy, którą definiujemy do jednokrotnego użytku. W takiej sytuacji, najpierw przekazujemy argumenty funkcji, potem piszemy `=>`, a na końcu umieszczamy ciało funkcji.
Przykładowy kod z lambdą:
```csharp=
character =>
{
return character.IsAlive
}
```
Powyższy kod można też zapisać w skróconej postaci:
```csharp=
character => character.IsAlive
```
Powyższe fragmenty kodu można zapisać bez wyrażenia lambda w taki sposób:
```csharp=
bool isCharacterAlive(Character character)
{
return character.IsAlive;
}
```
Wytłumaczenie na obrazku z painta:

## LINQ
W dużym uproszczeniu jest to część C#, ułatwiająca operacje na kolekcjach.
```csharp=
bool anyoneAlive = dataContext.Characters.Any(character => character.IsAlive);
```
Dla przykładu, powyższy fragment kodu iteruje po wszystkich elementach listy `dataContext.Characters`, aż jeden z elementów `character` będzie miał pole `IsAlive` o wartości `true`. Jeśli znajdzie taki element, zwraca `true`, w innym wypadku `false`.
```csharp=
Character aliveCharacter = dataContext.Characters.FirstOrDefault(character => character.IsAlive);
```
`FirstOrDefault()` zwraca pierwszy element listy, który spełnia określony w ( ) warunek, lub `null` jeśli nie będzie takiego.
## Dodatkowe informacje
### null
Jest to po prostu "nic".
### Zmiana nazwy zmiennej z automatyczną zmianą wszystkich jej wystąpień
W Visulu można to zrobić za pomocą skrutu klawiszowego `Ctrl+R, Ctrl+R`
###### tags: `.Net PG` `C#` `dziedziczenie`