Mam wątpliwości co do działania Enumeratorów i LINQ. Rozważ te dwa proste wybory:
List<Animal> sel = (from animal in Animals
join race in Species
on animal.SpeciesKey equals race.SpeciesKey
select animal).Distinct().ToList();
lub
IEnumerable<Animal> sel = (from animal in Animals
join race in Species
on animal.SpeciesKey equals race.SpeciesKey
select animal).Distinct();
Zmieniłem nazwy moich oryginalnych obiektów, aby wyglądało to na bardziej ogólny przykład. Samo zapytanie nie jest tak ważne. Chcę zapytać o to:
foreach (Animal animal in sel) { /*do stuff*/ }
Zauważyłem, że jeśli używam
IEnumerable
, kiedy debuguję i sprawdzam „sel”, którym w tym przypadku jest IEnumerable, ma on kilka interesujących elementów: „wewnętrzny”, „zewnętrzny”, „innerKeySelector” i „outerKeySelector”, pojawiają się te 2 ostatnie być delegatami. Członek „wewnętrzny” nie ma w nim instancji „Zwierzęcych”, lecz instancje „Gatunków”, co było dla mnie bardzo dziwne. Element „zewnętrzny” zawiera instancje „Zwierząt”. Zakładam, że dwaj delegaci określają, kto wchodzi i co wychodzi?Zauważyłem, że jeśli użyję „Wyraźny”, „wewnętrzny” zawiera 6 elementów (jest to niepoprawne, ponieważ tylko 2 są Wyróżniające), ale „zewnętrzny” zawiera prawidłowe wartości. Znów, prawdopodobnie delegowane metody to określają, ale jest to nieco więcej niż wiem o IEnumerable.
Co najważniejsze, która z dwóch opcji jest najlepsza pod względem wydajności?
Konwersja listy złych przez .ToList()
?
A może bezpośrednio za pomocą modułu wyliczającego?
Jeśli możesz, proszę wytłumacz trochę lub wrzuć linki, które wyjaśniają użycie IEnumerable.