Головна‎ > ‎C#‎ > ‎Додатково‎ > ‎

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