Tôi có một số nghi ngờ về cách thức hoạt động của En Countators và LINQ. Hãy xem xét hai lựa chọn đơn giản sau:
List<Animal> sel = (from animal in Animals
join race in Species
on animal.SpeciesKey equals race.SpeciesKey
select animal).Distinct().ToList();
hoặc là
IEnumerable<Animal> sel = (from animal in Animals
join race in Species
on animal.SpeciesKey equals race.SpeciesKey
select animal).Distinct();
Tôi đã thay đổi tên của các đối tượng ban đầu của tôi để nó trông giống như một ví dụ chung hơn. Các truy vấn không phải là quan trọng. Điều tôi muốn hỏi là đây:
foreach (Animal animal in sel) { /*do stuff*/ }
Tôi nhận thấy rằng nếu tôi sử dụng
IEnumerable
, khi tôi gỡ lỗi và kiểm tra "sel", trong trường hợp đó là IEnumerable, nó có một số thành viên thú vị: "bên trong", "bên ngoài", "InternalKeySelector" và "outsKeySelector", 2 cái cuối cùng này xuất hiện làm đại biểu. Thành viên "bên trong" không có phiên bản "Động vật" trong đó, mà là các trường hợp "Loài", điều này rất lạ đối với tôi. Thành viên "bên ngoài" có chứa các trường hợp "Động vật". Tôi đoán rằng hai đại biểu xác định cái nào đi vào và cái gì đi ra khỏi nó?Tôi nhận thấy rằng nếu tôi sử dụng "Khác biệt", "bên trong" chứa 6 mục (điều này không chính xác vì chỉ có 2 là Khác biệt), nhưng "bên ngoài" có chứa các giá trị chính xác. Một lần nữa, có lẽ các phương thức được ủy nhiệm xác định điều này nhưng điều này nhiều hơn một chút so với những gì tôi biết về IEnumerable.
Quan trọng nhất, lựa chọn nào trong hai tùy chọn là hiệu suất tốt nhất?
Danh sách ác chuyển đổi qua .ToList()
?
Hoặc có thể sử dụng điều tra viên trực tiếp?
Nếu bạn có thể, vui lòng giải thích một chút hoặc ném một số liên kết giải thích việc sử dụng IEnumerable này.