У меня есть некоторые сомнения относительно того, как работают счетчики, и LINQ. Рассмотрим эти два простых выбора:
List<Animal> sel = (from animal in Animals
join race in Species
on animal.SpeciesKey equals race.SpeciesKey
select animal).Distinct().ToList();
или
IEnumerable<Animal> sel = (from animal in Animals
join race in Species
on animal.SpeciesKey equals race.SpeciesKey
select animal).Distinct();
Я изменил имена своих исходных объектов, чтобы это выглядело как более общий пример. Сам запрос не так важен. Я хочу спросить:
foreach (Animal animal in sel) { /*do stuff*/ }
-
Я заметил, что если я использую
IEnumerable
, когда я отлаживаю и проверяю "sel", который в этом случае является IEnumerable, он имеет несколько интересных членов: "внутренний", "внешний", "innerKeySelector", и "outerKeySelector", эти последние 2 кажутся делегатами. "Внутренний" член не имеет экземпляров "Animal" в нем, а скорее экземпляров "Species", что для меня было очень странным. "Внешний" элемент содержит экземпляры "Животные". Я полагаю, что два делегата определяют, что входит и что выходит из него? -
Я заметил, что если я использую "Distinct", "inner" содержит 6 элементов (это неверно, так как только 2 являются Distinct), но "внешний" содержит правильные значения. Опять же, вероятно, делегированные методы определяют это, но это немного больше, чем я знаю об IEnumerable.
-
Самое главное, какой из двух вариантов является лучшим по производительности?
Преобразование злого списка через .ToList()
?
Или, может быть, напрямую использовать перечислитель?
Если вы можете, пожалуйста, также объясните немного или бросьте некоторые ссылки, объясняющие это использование IEnumerable.