LINQ
Выберем из массива строки, начинающиеся на определенную букву и отсортируем полученный список
// исходный массив
string[] place = { "Сочи", "Казань", "Мексика", "Москва", "Монголия", "Барселона" };
// список для результатов
var selectedPlace = new List<string>();
foreach (string s in place)
{
// ищем слова начинающиеся на букву "Б"
if (s.ToUpper().StartsWith("М"))
selectedPlace.Add(s);
}
// сортируем получившийся список
selectedPlace.Sort();
foreach (string s in selectedPlace)
Console.WriteLine(s);
Мексика
Монголия
Москва
Теперь проведем те же действия с помощью LINQ
string[] place = { "Сочи", "Казань", "Мексика", "Москва", "Монголия", "Барселона" };
var selectedPlace = from p in place // определяем каждый объект из place как p
where p.ToUpper().StartsWith("М") //фильтрация по критерию
orderby p // упорядочиваем по возрастанию
select p; // выбираем объект
foreach (string s in selectedPlace)
Console.WriteLine(s);
Мексика
Монголия
Москва
Методы расширения LINQ
string[] place = { "Сочи", "Казань", "Мексика", "Москва", "Монголия", "Барселона" };
var selectedPlace = place
.Where(t => t.ToUpper().StartsWith("М"))
.OrderBy(t => t);
foreach (string s in selectedPlace)
Console.WriteLine(s);
Мексика
Монголия
Москва
Фильтрация выборки и проекция
Фильтрация с помощью операторов LINQ
using System;
class Program
{
static void Main()
{
int[] tickets = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var evens = tickets.Where(ticket => ticket < 7);
Console.WriteLine("Осталость меньше 7 билетов:");
foreach (var ticket in evens)
{
Console.WriteLine(ticket);
}
}
}
Осталость меньше 7 билетов:
1
2
3
4
5
6
Выборка сложных объектов
using System;
class Client
{
public string Name { get; set; }
public int Age { get; set; }
public Client (string name, int age)
{
Name = name;
Age = age;
}
}
class Program
{
static void Main ()
{
List<Client> users = new List<Client>
{
new Client("Маша", 18),
new Client("Алиса", 23),
new Client("Саша", 30),
new Client("Вова", 25),
new Client("Алена", 37)
};
var selectedUsers = users.Where(u => u.Age < 30);
foreach (Client user in selectedUsers)
Console.WriteLine($"{user.Name} - {user.Age}");
}
}
Маша - 18
Алиса - 23
Вова - 25
Сложные фильтры
Для создания запроса применяется метод SelectMany
class Client
{
public string Name { get; set; }
public int Age { get; set; }
public List<string> Languages { get; set; }
public Client()
{
Languages = new List<string>();
}
}
class Progrem
{
static void Main ()
{
List<Client> users = new List<Client>
{
new Client {
Name="Тимур",
Age=23,
Languages = new List<string> {
"английский", "немецкий" }},
new Client {
Name="Алиса",
Age=27,
Languages = new List<string> {
"английский", "французский" }},
new Client {
Name="Дима",
Age=29,
Languages = new List<string> {
"китайский", "испанский" }},
new Client {
Name="Катя",
Age=24,
Languages = new List<string> {
"испанский", "немецкий" }}
};
var selectedUsers = users
.SelectMany(u => u.Languages,
(u, l) => new { Student = u, Lang = l })
.Where(u => u.Lang == "английский" && u.Student.Age < 30)
.Select(u => u.Student);
Console.WriteLine("Туристы знающие английский младше 30 лет: ");
foreach (Client user in selectedUsers)
Console.WriteLine($"{user.Name} - {user.Age}");
}
}
Туристы знающие английский младше 30 лет:
Тимур - 23
Алиса - 27
Проекция
Но нам нужен не весь объект, а только его свойство Name
class Client
{
public string Name { get; set; }
public int Age { get; set; }
}
class program
{
static void Main()
{
List<Client> users = new List<Client>();
users.Add(
new Client { Name = "Саша", Age = 43 });
users.Add(
new Client { Name = "Катя", Age = 33 });
users.Add(
new Client { Name = "Алена", Age = 24 });
var names = users.Select(u => u.Name);
foreach (string n in names)
Console.WriteLine(n);
}
}
Саша
Катя
Алена
Аналогично можно создать объекты другого типа, в том числе анонимного
using System;
class Client
{
public string Name { get; set; }
public int Age { get; set; }
public Client(string name, int age)
{
Name = name;
Age = age;
}
}
class Program
{
static void Main()
{
List<Client> users = new List<Client>
{
new Client("Маша", 18),
new Client("Алиса", 23),
new Client("Саша", 30),
new Client("Вова", 25),
new Client("Алена", 37)
};
var items = users.Select(u => new {
FirstName = u.Name,
DateOfBirth = DateTime.Now.Year - u.Age
});
foreach (var n in items)
Console.WriteLine($"{n.FirstName} - {n.DateOfBirth}");
}
}
Маша - 2006
Алиса - 2001
Саша - 1994
Вова - 1999
Алена - 1987
Переменые в запросах и оператор let
using System;
class Client
{
public string Name { get; set; }
public int Age { get; set; }
public Client(string name, int age)
{
Name = name;
Age = age;
}
}
class Program
{
static void Main()
{
List<Client> users = new List<Client>
{
new Client("Саша", 30),
new Client("Вова", 25),
};
var people = from u in users
let name = "Mr. " + u.Name
select new
{
Name = name,
Age = u.Age
};
foreach (var person in people)
{
Console.WriteLine($" {person.Name}");
}
}
}
Mr. Саша
Mr. Вова
Выборка из нескольких источников
class Country
{
public string Name { get; set; }
}
class Client
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main ()
{
List<Client> users = new List<Client>()
{
new Client{Name="Антон", Age=45},
new Client{Name="Вера", Age=23}
};
List<Country> countries = new List<Country>()
{
new Country
{
Name = "Россия"
},
new Country
{
Name="Австралия"
},
};
var people = from Client in users
from Country in countries
select new { Name = Client.Name, Country = Country.Name };
foreach (var p in people)
Console.WriteLine($"{ p.Name} - {p.Country}");
}
}
Антон - Россия
Антон - Австралия
Вера - Россия
Вера - Австралия
Сортировка
using System;
class Client
{
public string Name { get; set; }
public int Age { get; set; }
public Client(string name, int age)
{
Name = name;
Age = age;
}
}
class Program
{
static void Main()
{
List<Client> users = new List<Client>
{
new Client("Маша", 18),
new Client("Алиса", 23),
new Client("Саша", 30),
new Client("Вова", 25),
new Client("Алена", 37)
};
var sortedUsers = users.OrderBy(u => u.Name);
foreach (Client u in sortedUsers)
Console.WriteLine(u.Name);
}
}
Алена
Алиса
Вова
Маша
Саша
Множественные критерии сортировки
using System;
class Client
{
public string Name { get; set; }
public int Age { get; set; }
public Client(string name, int age)
{
Name = name;
Age = age;
}
}
class Program
{
static void Main()
{
List<Client> users = new List<Client>
{
new Client("Маша", 18),
new Client("Алиса", 23),
new Client("Саша", 30),
new Client("Вова", 25),
new Client("Алена", 37)
};
var result = users
.OrderBy(u => u.Name)
.ThenBy(u => u.Age);
foreach (Client u in result)
Console.WriteLine($"{u.Name} - {u.Age}");
}
}
Алена - 37
Алиса - 23
Вова - 25
Маша - 18
Саша - 30