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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 258 259 260 261 262 263 264 265 266 ... 642

При вызове метода 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;(), т.к. во время итерации он отфильтрует элементы, тип которых отличается от заданного:

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

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;() и т.д.).

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

namespace FunWithLinqExpressions

{

  class ProductInfo

  {

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

1 ... 258 259 260 261 262 263 264 265 266 ... 642
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю бесплатно.
Похожие на Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю книги

Оставить комментарий