У мене є деякі сумніви з приводу того, як працюють переписувачі та 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" і "externalKeySelector", ці останні 2 з'являються бути делегатами. "Внутрішній" член не має в ньому примірників "Тварина", а, наприклад, "Видові" екземпляри, що для мене було дуже дивно. "Зовнішній" член містить екземпляри "Animal". Я припускаю, що два делегати визначають, що входить і що з цього виходить?Я помітив, що якщо я використовую "Розрізнення", "внутрішній" містить 6 елементів (це невірно, оскільки лише 2 - "Відмінність", але "зовнішній" містить правильні значення. Знову ж таки, ймовірно, делеговані методи визначають це, але це трохи більше, ніж я знаю про IEnumerable.
Найголовніше, який із двох варіантів є найкращим?
Конвертація злого списку через .ToList()
?
Чи, можливо, безпосередньо користуватися перелічником?
Якщо ви можете, будь-ласка, поясніть також трохи або перекиньте кілька посилань, які пояснюють це використання IEnumerable.