Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
Применение запросов LINQ к объектам коллекций
Помимо извлечения результатов из простого массива данных выражения запросов LINQ могут также манипулировать данными внутри классов из пространства имен
System.Collections.Generic
List<T>
ListOverCollections
Car
namespace LinqOverCollections
{
class Car
{
public string PetName {get; set;} = "";
public string Color {get; set;} = "";
public int Speed {get; set;}
public string Make {get; set;} = "";
}
}
Теперь определите внутри операторов верхнего уровня локальную переменную типа
List<T>
Car
Car
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using LinqOverCollections;
Console.WriteLine("***** LINQ over Generic Collections *****n");
// Создать список List<> объектов Car.
List<Car> myCars = new List<Car>() {
new Car{ PetName = "Henry", Color = "Silver", Speed = 100, Make = "BMW"},
new Car{ PetName = "Daisy", Color = "Tan", Speed = 90, Make = "BMW"},
new Car{ PetName = "Mary", Color = "Black", Speed = 55, Make = "VW"},
new Car{ PetName = "Clunker", Color = "Rust", Speed = 5, Make = "Yugo"},
new Car{ PetName = "Melvin", Color = "White", Speed = 43, Make = "Ford"}
};
Console.ReadLine();
Доступ к содержащимся в контейнере подобъектам
Применение запроса LINQ к обобщенному контейнеру ничем не отличается от такого же действия в отношении простого массива, потому что LINQ to Objects может использоваться с любым типом, реализующим интерфейс
IEnumerable<T>
myCars
Car
55
После получения подмножества на консоль будет выведено имя каждого объекта
Car
PetName
List<Car>
static void GetFastCars(List<Car> myCars)
{
// Найти в List<> все объекты Car, у которых значение Speed больше 55.
var fastCars = from c in myCars where c.Speed > 55 select c;
foreach (var car in fastCars)
{
Console.WriteLine("{0} is going too fast!", car.PetName);
}
}
Обратите внимание, что выражение запроса захватывает из
List<T>
Speed
55
Нenry
Daisy
Чтобы построить более сложный запрос, можно искать только автомобили марки BMW со значением
Speed
90
&&
static void GetFastBMWs(List<Car> myCars)
{
// Найти быстрые автомобили BMW!
var fastCars = from c in myCars
where c.Speed > 90 && c.Make == "BMW" select c;
foreach (var car in fastCars)
{
Console.WriteLine("{0} is going too fast!", car.PetName);
}
}
Теперь выводится только одно имя
Henry
Применение запросов LINQ к необобщенным коллекциям
Вспомните, что операции запросов LINQ спроектированы для работы с любым типом, реализующим интерфейс
IEnumerable<T>
System.Array
System.Collections
Enumerable.OfТуре<Т>()