LINQ
Language Integrated Query - інтегрована мова запитів,
що дозволяє уніфікованим синтаксисом звертатися до різноманітних даних:
масиви, колекції, бази даних, файли XML, об'єкти DataSet
- LINQ to Objects - дозволяє застосовувати запити до масивів і колекцій об'єктів;
- LINQ to DataSet - дозволяє застосовувати запити LINQ до об'єктів DataSet з ADO.NET;
- LINQ to Entities - дозволяє застосовувати запити LINQ всередині APIінтерфейсу ADO.NET Entity Framework (EF);
- LINQ to XML - дозволяє застосовувати запити LINQ до документів XML і маніпулювати XML-даними;
- Parallel LINQ (PLINQ) - дозволяє виконувати паралельну обробку даних, повернутих запитом LINQ.
IEnumerable - елементи джерела мають реалізувати цей інтерфейс
тип змінної запиту = from змінна діапазону in джерело
where умова відбору даних
group групування
orderby сортування
select значення, яке повертається;
У LINQ змінна запиту зберігає відомості, необхідні для надання результатів при подальшому виконанні запиту. Фактичне виконання запиту відкладається до виконання ітерації змінної запиту в операторі foreach. Цю концепцію називають відкладеним виконанням.
Рядки
Усі елементи де є літера "i"
var list = list1.Where(x => x.Contains("i"));
Усі елементи заповнити нулями
var list = list1.Select(x => "0");
Нумерація списку
int i = 0;
var list = list1.Select(x => $"{ i++}. {x} element.");
Сортувати по зростанню
var list = list1.OrderBy(x => x);
Сортувати по спаданню
var list = list1.OrderByDescending(x => x);
З "i"-ками поставити в гору, а все інше сортувати по звичайному алфавіту
і пропустити перших 3 елементи
var list = list1.OrderByDescending(x => x.Contains("i")).ThenBy(x => x).Skip(3);
Показати записи, що мають хочаб один дублікат
var list = list1.GroupBy(g => g).Where(g => g.Count() > 1).Select(g => g.Key);
Цифри
Для багатьох елементів:
var b = a.Where(x => x > 50);
var b = a.Where(x => x > 50).Select(x => "*" + x.ToString() + "*");
var b = a.Select(x => "*" + x.ToString() + "*");
Для одного елементу:
var b = a.First(x => x.Contains("успішний")); // генерується помилка, якщо нема
var b = a.FirstOrDefault(x => x.Contains("успішний")); // не генерується помилка
var b = a.Any(x => x.Contains("успішний")).ToString(); // True
var b = a.All(x => x.Contains("успішний")).ToString(); // False
var b = a.First(x => x%2 == 0);
var b = a.Single(x => x%2 == 0); // генерується помилка, якщо таких чисел багато
Виключити один масив з іншого
Except
Пропускати поки в рядку є підрядок
SkipWhile
Сума
var numbers = new List<int> { 1, 2, 3, 4 };
int sum = numbers.Sum(); // 10
var numbers = new List<decimal> { 8.1m, 2.2m, 6.1m, 3.3m };
decimal sum = numbers.Sum(); // sum: 19.7
var numbers = new List<int?> { 1, 2, null, 4 };
int? sum = numbers.Sum(); // 7
var stringList = new List<string> { "1111", "222", "33", "4" };
int lengthSum = stringList.Select(x => x.Length).Sum(); // 10
int lengthSum = stringList.Sum(x => x.Length); // 10
Максимальний елемент
var numbers = new List<int> { 1, 3, 9, 5 };
int maxNumber = numbers.Max(); // 9
var numbers = new List<int>();
int maxNumber = numbers.Max(); // throws InvalidOperationException
var numbers = new List<int?>();
int? maxNumber = numbers.Max(); // null
var stringList = new List<string> { "1111", "222", "33", "4" };
int maxLength = stringList.Max(x => x.Length); // 4
Мінімальний елемент
var numbers = new List<int> { 1, 3, 9, 5 };
int minNumber = numbers.Min(); // 1
Кількість елементів < 4
IEnumerable<int> items = new List<int> { 1, 3, 9, 5 };
int count = items.Count(); // 4
int count = items.Count(x => x < 4); // 2
int count = items.Where(x => x < 4).Count(); // 2
long count = items.LongCount(); // для великих чисел
Середнє значення
var list = new List<int> { 1, 2, 3, 4 };
double result = list.Average(); // 2.5
var stringList = new List<string> { "1", "22", "333", "4444" };
double result = stringList.Select(x => x.Length).Average(); // 2.5
double result = stringList.Average(x => x.Length);
var w = list1.Intersect(list13); // ті що пересікаються
var q = list1.Except(list14); // за виключенням
З Лямда-функцією
var numbers = new List<int> { 1, 2, 3, 2 };
int sum = numbers.Aggregate(func: (result, item) => result * item); // 12
var numbers = new List<int> { 1, 2, 3, 4 };
decimal average = numbers.Aggregate(
seed: 0,
func: (result, item) => result + item,
resultSelector: result => (decimal)result / numbers.Count
);
// ((((0+1)+2)+3)+4) / 4 = 2.5
Пошук максимуму в командах
var players = new List<Player> {
new Player { Name = "Юля", Team = "А", Score = 4 },
new Player { Name = "Дмитро", Team = "А", Score = 10 },
new Player { Name = "Діана", Team = "Б", Score = 9 },
new Player { Name = "Петро", Team = "Б", Score = 8 },
};
var teamBestScores =
from player in players
group player by player.Team into playerGroup
select new
{
Team = playerGroup.Key,
BestScore = playerGroup.Max(x => x.Score),
};
// { Team = "А", BestScore = 10 }
// { Team = "Б", BestScore = 9 }
Кількість людей в кожній команді
...
select new {
Team = playerGroup.Key,
Count = playerGroup.Count(),
};
// { Team = "А", Count = 2 }
// { Team = "Б", Count = 2 }
Середнє значення для кожної команди
...
select new {
Team = playerGroup.Key,
AverageScore = playerGroup.Average(x => x.Score),
};
// { Team = "A", AverageScore = 7 }
// { Team = "Б", AverageScore = 8.5 }
Пінг
List<string> list = new List<string>{ "facebook.com", "instagram.com", "youtube.com" };
var newList = list.Where(x => new Ping().Send(x).RoundtripTime < 100);
textBox.Text = string.Join(Environment.NewLine, newList);
facebook.com
youtube.com
list.Select(x => $"{x} {new Ping().Send(x).RoundtripTime}");
facebook.com 49
instagram.com 125
youtube.com 25