У меня всегда есть вопрос о 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 создаст несколько перечислений для этого единственного запроса, а это значит, что некоторое содержимое моего списка будет скопировано несколько раз? (Обратный выхода оператор копирует элемент в список, я полагаю?)
Где перечислитель имеет смысл. Так это означает, что элементы будут скопированы 2 раза? –
@ 刀 之 魂, если у вас есть источник ссылочных типов (например, классы), тогда копируются только адреса элементов. С 'where' это не проблема, потому что он будет возвращать только совпадающие элементы адресов один за другим (у вас будет только одна копия за раз). OrderBy, к сожалению, должен иметь адреса всех элементов для сортировки их. –
Спасибо. Мне просто интересно, как Microsoft реализует LINQ. Это очень помогает мне. –