C# LINQ

2075 / C# / LINQ

 

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),

};
{ 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);

facebook.com
youtube.com

 

var newList = list.Select(x => $"{x} {new Ping().Send(x).RoundtripTime}");

facebook.com 49
instagram.com 125
youtube.com 25

 


– 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.