Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
При вызове метода
OfТуре<Т>()
ArrayList
IEnumerable<T>
Взгляните на показанный ниже новый метод, который заполняет
ArrayList
Car
System.Collections
Program.cs
static void LINQOverArrayList()
{
Console.WriteLine("***** LINQ over ArrayList *****");
// Необобщенная коллекция объектов Car.
ArrayList myCars = new ArrayList() {
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"}
};
// Трансформировать ArrayList в тип, совместимый c IEnumerable<T>.
var myCarsEnum = myCars.OfType<Car>();
// Создать выражение запроса, нацеленное на совместимый с IEnumerable<T> тип.
var fastCars = from c in myCarsEnum where c.Speed > 55 select c;
foreach (var car in fastCars)
{
Console.WriteLine("{0} is going too fast!", car.PetName);
}
}
Аналогично предшествующим примерам этот метод, вызванный в операторах верхнего уровня, отобразит только имена
Henry
Daisy
Фильтрация данных с использованием метода OfТуре<Т>()
Как вы уже знаете, необобщенные типы способны содержать любые комбинации элементов, поскольку члены этих контейнеров (вроде
ArrayList
System.Object
ArrayList
OfТуре<Т>()
static void OfTypeAsFilter()
{
// Извлечь из ArrayList целочисленные значения.
ArrayList myStuff = new ArrayList();
myStuff.AddRange(new object[] { 10, 400, 8, false, new Car(), "string data" });
var myInts = myStuff.OfType<int>();
// Выводит 10, 400 и 8.
foreach (int i in myInts)
{
Console.WriteLine("Int value: {0}", i);
}
}
К настоящему моменту вы уже умеете применять запросы LINQ к массивам, а также обобщенным и необобщенным коллекциям. Контейнеры подобного рода содержат элементарные типы C# (целочисленные и строковые данные) и специальные классы. Следующей задачей будет изучение многочисленных дополнительных операций LINQ, которые могут использоваться для построения более сложных и полезных запросов.
Исследование операций запросов LINQ
В языке C# предопределено порядочное число операций запросов. Некоторые часто применяемые из них перечислены в табл. 13.2. В дополнение к неполному списку операций, приведенному в табл. 13.3, класс
System.Linq.Enumerable
Reverse<>()
ToArray<>()
ToList<>()
Distinct<>()
Union<>()
Intersect<>()
Count<>()
Sum<>()
Min<>()
Мах<>()

Чтобы приступить к исследованию более замысловатых запросов LINQ, создайте новый проект консольного приложения по имени
FunWithLinqExpressions
FunWithLinqExpressions
ProductInfo
namespace FunWithLinqExpressions
{
class ProductInfo
{
public string Name {get; set;} = "";