Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
Книгу Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!
Шрифт:
Интервал:
Закладка:
{
Console.WriteLine("{0} is going too fast!", car.PetName);
}
}
Теперь выводится только одно имя Henry.
Применение запросов LINQ к необобщенным коллекциям
Вспомните, что операции запросов LINQ спроектированы для работы с любым типом, реализующим интерфейс IEnumerable<T> (как напрямую, так и через расширяющие методы). Учитывая то, что класс System.Array оснащен всей необходимой инфраструктурой, может оказаться сюрпризом, что унаследованные (необобщенные) контейнеры в пространстве имен System.Collections такой поддержкой не обладают. К счастью, итерация по данным, содержащимся внутри необобщенных коллекций, по-прежнему возможна с использованием обобщенного расширяющего метода Enumerable.OfТуре<Т>().
При вызове метода 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Туре<Т>(), т.к. во время итерации он отфильтрует элементы, тип которых отличается от заданного:
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;} = "";
public string Description {get; set;} = "";
public int NumberInStock {get; set;} = 0;
public override string ToString()
=> $"Name={Name}, Description={Description},
Number in Stock={NumberInStock}";
}
}
Теперь заполните массив объектами ProductInfo в вызывающем коде:
Console.WriteLine("***** Fun with Query Expressions *****n");
// Этот массив будет основой для тестирования...
ProductInfo[] itemsInStock = new[] {
new ProductInfo{ Name = "Mac's Coffee",
Description = "Coffee with TEETH", NumberInStock = 24},
new ProductInfo{ Name = "Milk Maid Milk",
Description = "Milk cow's love", NumberInStock = 100},
new ProductInfo{ Name = "Pure Silk Tofu",
Description = "Bland as Possible", NumberInStock = 120},
new ProductInfo{ Name = "Crunchy Pops",
Description = "Cheezy, peppery goodness", NumberInStock = 2},
new ProductInfo{ Name = "RipOff Water",
Description = "From the tap to your wallet", NumberInStock = 100},
new ProductInfo{ Name = "Classic Valpo Pizza",
Description = "Everyone loves pizza!", NumberInStock = 73}
};
// Здесь мы будем вызывать разнообразные методы!
Console.ReadLine();
Базовый синтаксис выборки
Поскольку синтаксическая корректность выражения запроса LINQ проверяется на этапе компиляции, вы должны помнить, что порядок следования операций критически важен. В простейшем виде каждый запрос LINQ строится с использованием операций from, in и select.
Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.
Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.
- 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
- 2. Просьба отказаться от оскорблений, угроз и запугиваний.
- 3. Просьба отказаться от нецензурной лексики.
- 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.
Надеемся на Ваше понимание и благоразумие. С уважением, администратор knigkindom.ru.
Оставить комментарий
-
Гость Татьяна24 сентябрь 22:20 Как то не очень... Невеста по ошибке. Я не дам тебе развод - Майя Линн
-
Римма24 сентябрь 21:52 Почему главные героинитпкие идиотки? И сюжет не плохой, и написано хорошо. Но как героиня - так дура дурой.... Хозяйка маленького дома, или Любимая для дракона - Кира Рамис
-
Римма20 сентябрь 12:27 Много ненужных пояснений и отступлений. Весь сюжет теряет свою привлекательность. Героиня иногда так тупит, что читать не... Хозяйка приюта для перевертышей и полукровок - Елена Кутукова