Trong dự án của tôi, tôi có MyClass
triển khai IMyClass
. Tôi cần trả lại danh sách IMyClass
bằng cách chuyển đổi danh sách các mục khác. Vì mục đích đơn giản, giả sử rằng tôi có thể tạo một MyClass
chỉ bằng cách chuyển một mục khác vào hàm tạo của nó, tức là new MyClass(item)
.Tôi có nên bỏ vào trang lambda của mình hoặc bỏ IEnumerable không?
Hãy xem xét hai dòng sau đây, trong đó (như xa như tôi biết) tạo ra kết quả tương tự:
var option1 = items.Select(item => new MyClass(item)).Cast<IMyClass>().ToList()
var option2 = items.Select(item => new MyClass(item) as IMyClass).ToList()
Dường như với tôi rằng tùy chọn # 1 sẽ đòi hỏi một liệt kê đôi, một lần để đúc tất cả các mục vào giao diện của tôi và một lần để tạo danh sách. Nếu tôi đúng thì tùy chọn # 2 sẽ thông minh hơn. Tuy nhiên, tôi đã không bao giờ thấy bất kỳ mã nào sử dụng một cái gì đó như tùy chọn # 2 và tôi có xu hướng giả định rằng tôi không đủ thông minh để tìm ra thứ gì đó thông minh mà phần còn lại của cộng đồng C# không.
Trên một lưu ý phụ, tôi nghĩ rằng tùy chọn # 2 mang tính thẩm mỹ hơn, nhưng đó chỉ là tôi.
Câu hỏi của tôi là: là tùy chọn # 2 của tôi là một ý tưởng hay hơn như tôi nghĩ? Có bất kỳ gotchas tôi đang thiếu hoặc lý do khác tại sao tôi muốn dính vào với tùy chọn # 1? Hay tôi có lẽ so sánh hai ý tưởng ngu ngốc khi có một ý tưởng thứ ba thông minh hơn mà tôi đang thiếu hoàn toàn?
Đừng quên rằng số đếm là lười biếng và có thể tổng hợp! Tùy chọn 1 sẽ không làm cho nó được liệt kê hai lần ... –
Tại sao bạn cần truyền nếu 'MyClass' triển khai' IMyClass'? –
Bạn biết bạn luôn có thể đánh vần các loại mà không suy luận? Tức là 'var result = items.Select (x => new MyClass (x)). ToList();' Điều này sẽ trả về 'IEnumerable ' :) –