Язык программирования C#9 и платформа .NET5 - Джепикс Филипп - Страница 264
- Предыдущая
- 264/642
- Следующая
{ Console.WriteLine(c.ToString()); }}Как демонстрировалось ранее в главе, при указании конструкции
where// Получить автомобили BMW, движущиеся со скоростью минимум 90 миль в час.var onlyFastBMWs = from c in myCars where c.Make == "BMW" && c.Speed >= 100 select c;Проецирование в новые типы данных
Новые формы данных также можно проецировать из существующего источника данных. Давайте предположим, что необходимо принять входной параметр
ProductInfo[]selectstatic void GetNamesAndDescriptions(ProductInfo[] products){ Console.WriteLine("Names and Descriptions:"); var nameDesc = from p in products select new { p.Name, p.Description }; foreach (var item in nameDesc) { // Можно было бы также использовать свойства Name // и Description напрямую. Console.WriteLine(item.ToString()); }}Не забывайте, что когда запрос LINQ использует проекцию, нет никакого способа узнать лежащий в ее основе тип данных, т.к. он определяется на этапе компиляции. В подобных случаях ключевое слово
varstatic var GetProjectedSubset(ProductInfo[] products){ var nameDesc = from p in products select new { p.Name, p.Description }; return nameDesc; // Так поступать нельзя!}В случае необходимости возвращения спроецированных данных вызывающему коду один из подходов предусматривает трансформацию результата запроса в объект
System.ArrayТоArray()// Теперь возвращаемым значением является объект Array.static Array GetProjectedSubset(ProductInfo[] products){ var nameDesc = from p in products select new { p.Name, p.Description }; // Отобразить набор анонимных объектов на объект Array. return nameDesc.ToArray();}метод
GetProjectedSubset()Array objs = GetProjectedSubset(itemsInStock);foreach (object o in objs){ Console.WriteLine(o); // Вызывает метод ToString() // на каждом анонимном объекте.}Как видите, здесь должен использоваться буквальный объект
System.ArrayToArray<Т>()Очевидная проблема связана с утратой строгой типизации, т.к. каждый элемент в объекте
ArrayObjectArrayEnumerableПроецирование в другие типы данных
В дополнение к проецированию в анонимные типы результаты запроса LINQ можно проецировать в другой конкретный тип, что позволяет применять статическую типизацию и реализацию
IEnumerable<T>ProductInfonamespace FunWithLinqExpressions{ class ProductInfoSmall { public string Name {get; set;} = ""; public string Description {get; set;} = ""; public override string ToString() => $"Name={Name}, Description={Description}"; }}Следующее изменение касается проецирования результатов запроса в коллекцию объектов
ProductInfoSmallProductInfoSmall- Предыдущая
- 264/642
- Следующая
