LINQ – Language-Integrated Query (інтегрована мова запитів)
Запит, за допомогою якого можна отримати дані з різних джерел:
колекції, масиви, бази даних та XML-документи
Отримуємо на вхід колекцію IEnumerable<T> та перетворюємо її в нову колекцію
T – тип елементів джерела даних
тип змінної запиту = from змінна діапазону in джерело
where умова відбору даних
group групування
orderby сортування
select значення, яке повертається;
Рядки
Усі елементи де є літера "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" };
stringList.Select(x => x.Length).Sum(); // 10
stringList.Sum(x => x.Length); // 10
Максимальний елемент
var numbers = new List<int> { 1, 3, 9, 5 };
numbers.Max(); // 9
var numbers = new List<int>();
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 };
numbers.Min(); // 1
Кількість елементів < 4
IEnumerable<int> items = new List<int> { 1, 3, 9, 5 };
items.Count(); // 4
items.Count(x => x < 4); // 2
items.Where(x => x < 4).Count(); // 2
long count = items.LongCount(); // для великих чисел
Середнє значення
var list = new List<int> { 1, 2, 3, 4 };
list.Average(); // 2.5
var stringList = new List<string> { "1", "22", "333", "4444" };
stringList.Select(x => x.Length).Average(); // 2.5
stringList.Average(x => x.Length);
var w = list1.Intersect(list13); // ті що пересікаються
var q = list1.Except(list14); // за виключенням З Лямда-функцією
var numbers = new List<int> { 1, 2, 3, 2 };
numbers.Aggregate(func: (result, item) => result * item); // 12
var numbers = new List<int> { 1, 2, 3, 4 };
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),
};
Кількість людей в кожній команді
... select new { Team = playerGroup.Key, Count = playerGroup.Count(), };
{ Team = "Б", Count = 2 }
Середнє значення для кожної команди
... select new { Team = playerGroup.Key, AverageScore = playerGroup.Average(x => x.Score),
};
{ 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);
youtube.com
var newList = list.Select(x => $"{x} {new Ping().Send(x).RoundtripTime}");
instagram.com 125
youtube.com 25