Литмир - Электронная Библиотека
A
A

class LINQBasedFieldsAreClunky

{

  private static string[] currentVideoGames =

    {"Morrowind", "Uncharted 2",

    "Fallout 3", "Daxter", "System Shock 2"};

<b>  // Здесь нельзя использовать неявную типизацию!</b>

<b>  // Тип subset должен быть известен!</b>

  private IEnumerable&lt;string&gt; subset =

    from g in currentVideoGames

    where g.Contains(&quot; &quot;)

    orderby g

    select g;

  public void PrintGames()

  {

    foreach (var item in subset)

    {

      Console.WriteLine(item);

    }

  }

}

Запросы LINQ часто определяются внутри области действия метода или свойства. Кроме того, для упрощения программирования результирующий набор будет храниться в неявно типизированной локальной переменной, использующей ключевое слово

var
. Вспомните из главы 3, что неявно типизированные переменные не могут применяться для определения параметров, возвращаемых значений, а также полей класса или структуры.

Итак, вполне вероятно, вас интересует, каким образом возвратить результат запроса внешнему коду. Ответ: в зависимости от обстоятельств. Если у вас есть результирующий набор, состоящий из строго типизированных данных, такой как массив строк или список

List&lt;T&gt;
объектов
Car
, тогда вы могли бы отказаться от использования ключевого слова
var
и указать подходящий тип
IEnumerable&lt;T&gt;
либо
IEnumerable
(т.к.
IEnumerable&lt;T&gt;
расширяет
IEnumerable
). Ниже приведен пример класса
Program
в новом проекте консольного приложения по имени
LinqRetValues
:

using System;

using System.Collections.Generic;

using System.Linq;

Console.WriteLine(&quot;***** LINQ Return Values *****\n&quot;);

IEnumerable&lt;string&gt; subset = GetStringSubset();

foreach (string item in subset)

{

  Console.WriteLine(item);

}

Console.ReadLine();

static IEnumerable&lt;string&gt; GetStringSubset()

{

  string[] colors = {&quot;Light Red&quot;, &quot;Green&quot;, &quot;Yellow&quot;, &quot;Dark Red&quot;, &quot;Red&quot;, &quot;Purple&quot;};

  // Обратите внимание, что subset является

  // совместимым с IEnumerable&lt;string&gt; объектом.

  IEnumerable&lt;string&gt; theRedColors =

     from c in colors where c.Contains(&quot;Red&quot;) select c;

  return theRedColors;

}

Результат выглядит вполне ожидаемо:

Light Red

Dark Red

Red

Возвращение результатов LINQ посредством немедленного выполнения

Рассмотренный пример работает ожидаемым образом только потому, что возвращаемое значение

GetStringSubset()
и запрос LINQ внутри этого метода были строго типизированными. Если применить ключевое слово
var
для определения переменной
subset
, то возвращать значение будет разрешено, только если метод по-прежнему прототипирован с возвращаемым типом
IEnumerable&lt;string&gt;
(и если неявно типизированная локальная переменная на самом деле совместима с указанным возвращаемым типом).

Поскольку оперировать с типом

IEnumerable&lt;T&gt;
несколько неудобно, можно задействовать немедленное выполнение. Скажем, вместо возвращения
IEnumerable&lt;string&gt;
можно было бы возвратить просто
string[]
при условии трансформации последовательности в строго типизированный массив. Именно такое действие выполняет новый метод класса
Program
:

static string[] GetStringSubsetAsArray()

{

  string[] colors = {&quot;Light Red&quot;, &quot;Green&quot;,

                     &quot;Yellow&quot;, &quot;Dark Red&quot;, &quot;Red&quot;, &quot;Purple&quot;};

  var theRedColors = from c in colors where c.Contains(&quot;Red&quot;) select c;

  // Отобразить результаты в массив.

  return theRedColors.ToArray();

}

В таком случае вызывающий код совершенно не знает, что полученный им результат поступил от запроса LINQ, и просто работает с массивом строк вполне ожидаемым образом. Вот пример:

foreach (string item in GetStringSubsetAsArray())

{

  Console.WriteLine(item);

}

Немедленное выполнение также важно при попытке возвратить вызывающему коду результаты проецирования LINQ. Мы исследуем эту тему чуть позже в главе. А сейчас давайте посмотрим, как применять запросы LINQ к обобщенным и необобщенным объектам коллекций.

260
{"b":"847442","o":1}