WhereW .NET istnieje wiele technik do iteracji i wybierania danych z kolekcji. Najlepszym wynalazkiem C# jest LINQ.
Zostałem poproszony o stworzenie prostego przykładu LINQ, który by po prostu pobierałby elementy kolekcji w zależności od naszych potrzeb. Nie mam dużo czasu by się rozpisywać więc pomyślałem czemu nie.
Ten wpis jest przeznaczony całkowicie dla początkujących.
W tym przykładzie stworze klasę “Person” z następującymi właściwościami. [Imię , Kraj, Płeć i Wiek]
enum Gender
{
Male,
Female
}
class Person
{
public string Name { set; get; }
public string Country { set; get; }
public Gender Sex { set; get; }
public int Age { set; get; }
}
Do testowania selekcjonowania kolekcji potrzebujemy oczywiście samej kolekcji. Oto metoda tworząca kolekcję.
static List<Person> GetPersonCollection()
{
List<Person> _persons = new List<Person>();
_persons.Add(new Person()
{
Name = "Jacek",
Age = 21,
Sex = Gender.Male,
Country = "US",
});
_persons.Add(new Person()
{
Name = "Darek",
Age = 31,
Sex = Gender.Male,
Country = "US",
});
_persons.Add(new Person()
{
Name = "IKAZUKI",
Age = 32,
Sex = Gender.Male,
Country = "JAPAN",
});
_persons.Add(new Person()
{
Name = "Yukidoh",
Age = 15,
Sex = Gender.Male,
Country = "JAPAN",
});
_persons.Add(new Person()
{
Name = "Victoria",
Age = 21,
Sex = Gender.Female,
Country = "UK",
});
return _persons;
}
Teraz gdy mamy kolekcję klasy “Person” możemy przejść do selekcjonowania danych.
Zadanie 1:
Wybierz wszystkie osoby płci męskiej.
List<Person> persons = GetPersonCollection();
var males = persons.Where(x => x.Sex == Gender.Male);
foreach (Person emp in males)
{
Console.WriteLine(" Person Name {0},\tAge {1},\tSex {2},\tcountry {3}", emp.Name,
emp.Age, emp.Sex, emp.Country);
}
W wyrażeniu where tworzy odpowiednie wyrażenie lambda, które określa warunek logiczny, który musi być spełniony w trakcie sortowania elementów.
Wynik kolekcji:
Zadanie 2:
Wybierz wszystkie osoby z kraju Japonia.
foreach (Person emp in GetPersonCollection().Where(x => x.Country == "JAPAN"))
{
Console.WriteLine(" Person Name {0},\tAge {1},\tSex {2},\tcountry {3}",
emp.Name, emp.Age, emp.Sex, emp.Country);
}
Analogicznie do poprzedniego przykładu tym razem jednak wybieramy właściwość Country i określamy, że musi się ona równać napisowi “Japan”.
Zauważ, że nie musi tworzyć zmiennej przed pętlą foreach możemy wyselekcjonować elementy w wyrażeniu “in”. Kolekcja na pewno zostanie wyselekcjonowana tylko raz.
Zadanie 3
Wybierz osoby, które są z US i mają więcej niż 26 lat.
foreach (Person emp in GetPersonCollection().Where(x => x.Country == "US" && x.Age > 26))
{
Console.WriteLine(" Person Name {0},\tAge {1},\tSex {2},\tcountry {3}",
emp.Name, emp.Age, emp.Sex, emp.Country);
}
Console.ReadLine();
Używając wyrażenia AND “&&’” możesz dodawać więcej ograniczeń.
Zadanie 4:
Pogrupuj osoby według krajów i je wyświetl.
foreach (var empgrp in GetPersonCollection().GroupBy(x => x.Country).Select(x => new { x.Key, x }))
{
Console.WriteLine("Country {0}", empgrp.Key);
foreach (Person emp in empgrp.x)
Console.WriteLine(" Person Name {0},\tAge {1},\tSex {2}", emp.Name, emp.Age, emp.Sex);
Console.WriteLine();
}
Console.Read();
Wyrażenie GroupBy podniosło trochę poziom trudności tego wpisu, ale podobnie jak z wyrażeniem where określamy, po jakiej właściwości dane mają być pogrupowane.
Potem wyrażenie select tworzy klasę anonimową zawierającą dwie właściwości: Klucz grupowania – “nazwa kraju” oraz cały obiekt klasy Person.
Iterujemy po obiektach tej klasy anonimowej i wyświetlamy klucz, jak i zbiór elementów drugiej właściwości, która zawiera kolekcję elementów Person pogrupowanej po nazwie danego kraju.
Używamy drugiej pętli foreach by wyświetlić pogrupowaną kolekcję elementów po kluczu.
To były proste przykłady prawda