KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Базы данных » Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Троелсен Эндрю, "Язык программирования 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
, основываясь на формате запроса LINQ.

Фильтрация данных с использованием метода OfТуре<Т>()

Как вы уже знаете, необобщенные типы способны содержать любые комбинации элементов, поскольку члены этих контейнеров (вроде

ArrayList
) прототипированы для приема
System.Object
. Например, предположим, что
ArrayList
содержит разные элементы, часть которых являются числовыми. Получить подмножество, состоящее только из числовых данных, можно с помощью метода
OfТуре&lt;Т&gt;()
, т.к. во время итерации он отфильтрует элементы, тип которых отличается от заданного:

static void OfTypeAsFilter()

{

  // Извлечь из ArrayList целочисленные значения.

  ArrayList myStuff = new ArrayList();

  myStuff.AddRange(new object[] { 10, 400, 8, false, new Car(), &quot;string data&quot; });

  var myInts = myStuff.OfType&lt;int&gt;();

  // Выводит 10, 400 и 8.

  foreach (int i in myInts)

  {

    Console.WriteLine(&quot;Int value: {0}&quot;, i);

  }

}

К настоящему моменту вы уже умеете применять запросы LINQ к массивам, а также обобщенным и необобщенным коллекциям. Контейнеры подобного рода содержат элементарные типы C# (целочисленные и строковые данные) и специальные классы. Следующей задачей будет изучение многочисленных дополнительных операций LINQ, которые могут использоваться для построения более сложных и полезных запросов.

Исследование операций запросов LINQ

В языке C# предопределено порядочное число операций запросов. Некоторые часто применяемые из них перечислены в табл. 13.2. В дополнение к неполному списку операций, приведенному в табл. 13.3, класс

System.Linq.Enumerable
предлагает набор методов, которые не имеют прямого сокращенного обозначения в виде операций запросов С#, а доступны как расширяющие методы. Эти обобщенные методы можно вызывать для трансформации результирующего набора разными способами (
Reverse&lt;&gt;()
,
ToArray&lt;&gt;()
,
ToList&lt;&gt;()
и т.д.). Некоторые из них применяются для извлечения одиночных элементов из результирующего набора, другие выполняют разнообразные операции над множествами (
Distinct&lt;&gt;()
,
Union&lt;&gt;()
,
Intersect&lt;&gt;()
и т.п.), а есть еще те, что агрегируют результаты (
Count&lt;&gt;()
,
Sum&lt;&gt;()
,
Min&lt;&gt;()
,
Мах&lt;&gt;()
и т.д.).

Язык программирования C#9 и платформа .NET5 - _088.png

Чтобы приступить к исследованию более замысловатых запросов LINQ, создайте новый проект консольного приложения по имени

FunWithLinqExpressions
и затем определите массив или коллекцию некоторых выборочных данных. В проекте
FunWithLinqExpressions
вы будете создавать массив объектов типа
ProductInfo
, определенного следующим образом:

namespace FunWithLinqExpressions

{

  class ProductInfo

  {

    public string Name {get; set;} = &quot;&quot;;

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*