Язык программирования C#9 и платформа .NET5. Страница 257
Модифицируйте код метода
QueryOverStrings()// Построить выражение запроса для поиска// в массиве элементов, содержащих пробел.IEnumerable<string> subset = from g in currentVideoGames where g.Contains(" ") orderby g select g;<b>ReflectOverQueryResults(subset);</b>// Вывести результаты.foreach (string s in subset){ Console.WriteLine("Item: {0}", s);}Запустив приложение, легко заметить, что переменная
subsetOrderedEnumerable<TElement, ТКеу>OrderedEnumerable`2System.Linq.dll***** Info about your query using Query Expressions*****resultSet is of type: OrderedEnumerable`2resultSet location: System.LinqВнесите такое же изменение в код метода
QueryOverStringsWithExtensionMethods()Extension Methods// Построить выражение запроса для поиска// в массиве элементов, содержащих пробел.IEnumerable<string> subset = currentVideoGames .Where(g => g.Contains(" ")) .OrderBy(g => g).Select(g => g);<b>ReflectOverQueryResults(subset,"Extension Methods");</b>// Вывести результаты.foreach (string s in subset){ Console.WriteLine("Item: {0}", s);}После запуска приложения выяснится, что переменная
subsetSelectIPartitionIteratorSelect(g=>g)subsetOrderedEnumerable<TElement, ТКеу>IEnumerable<T>***** Info about your query using Extension Methods *****resultSet is of type: SelectIPartitionIterator`2resultSet location: System.LinqLINQ и неявно типизированные локальные переменные
Хотя в приведенной программе относительно легко выяснить, что результирующий набор может быть интерпретирован как перечисление объектов
stringIEnumerable<string>OrderedEnumerable<TElement, ТКеу>Поскольку результирующие наборы LINQ могут быть представлены с применением порядочного количества типов из разнообразных пространств имен LINQ, было бы утомительно определять подходящий тип для хранения результирующего набора. Причина в том, что во многих случаях лежащий в основе тип не очевиден и даже напрямую не доступен в коде (и как вы увидите, в ряде ситуаций тип генерируется на этапе компиляции).
Чтобы еще больше подчеркнуть данное обстоятельство, ниже показан дополнительный вспомогательный метод, определенный внутри класса
Programstatic void QueryOverInts(){ int[] numbers = {10, 20, 30, 40, 1, 2, 3, 8}; // Вывести только элементы меньше 10. IEnumerable<int> subset = from i in numbers where i < 10 select i; foreach (int i in subset) { Console.WriteLine("Item: {0}", i); } ReflectOverQueryResults(subset);}В рассматриваемом случае переменная
subsetIEnumerable<int>WhereArrayIterator<T>Item: 1Item: 2Item: 3Item: 8***** Info about your query *****resultSet is of type: WhereArrayIterator`1resultSet location: System.LinqУчитывая, что точный тип запроса LINQ не вполне очевиден, в первых примерах результаты запросов были представлены как переменная
IEnumerable<T>ТstringintIEnumerable<T>IEnumerable