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