2013-12-05 2 views
3

У меня всегда есть вопрос о LINQ при его использовании.Номера итераций, сгенерированных в одном запросе LINQ

Сколько итераторы были созданы для следующего кода (тест является список):

 var result = from t in test 
        where t.Length > 0 && t.Length < 5 
        orderby t[0] 
        select t; 

Насколько я знаю, этот запрос компилируется как:

 var result2 = test.Where(t => t.Length > 0).Where(t => t.Length < 5).OrderBy(t => t[0]); 

Я осмотрел .NET и нашел, что реализация Where просто вызывает функцию предиката и дает результат:

private static IEnumerable<TSource> WhereIterator<TSource>(IEnumerable<TSource> source, Func<TSource, int, bool> predicate) 
    { 
     int iteratorVariable0 = -1; 
     foreach (TSource iteratorVariable1 in source) 
     { 
      iteratorVariable0++; 
      if (predicate(iteratorVariable1, iteratorVariable0)) 
      { 
       yield return iteratorVariable1; 
      } 
     } 
    } 

Я считаю, что Microsoft реализует OrderBy и другие функции аналогичным образом (OrderedEnumerable для OrderBy, я полагаю).

Означает ли это, что LINQ создаст несколько перечислений для этого единственного запроса, а это значит, что некоторое содержимое моего списка будет скопировано несколько раз? (Обратный выхода оператор копирует элемент в список, я полагаю?)

ответ

1

На самом деле ваш запрос будет составлен в одном Where оператора:

var result2 = test.Where(t => t.Length > 0 && t.Length < 5).OrderBy(t => t[0]); 

И полностью будут созданы два счетчиков:

  • один источник для фильтрации с помощью предиката
  • один для перечисления источника фильтрованной для сортировки предметов
+0

Где перечислитель имеет смысл. Так это означает, что элементы будут скопированы 2 раза? –

+1

@ 刀 之 魂, если у вас есть источник ссылочных типов (например, классы), тогда копируются только адреса элементов. С 'where' это не проблема, потому что он будет возвращать только совпадающие элементы адресов один за другим (у вас будет только одна копия за раз). OrderBy, к сожалению, должен иметь адреса всех элементов для сортировки их. –

+1

Спасибо. Мне просто интересно, как Microsoft реализует LINQ. Это очень помогает мне. –

Смежные вопросы