2013-01-09 22 views
12

dụ ngẫu nhiên:Tại sao có quá nhiều bộ sưu tập có tên trong .NET không triển khai IEnumerable <T>?

ConfigurationElementCollection 

Net có tấn của các WhateverCollection lớp nhỏ mà không thực hiện IEnumerable<T>, có nghĩa là tôi không thể sử dụng LINQ to đối tượng với họ ra khỏi hộp. Ngay cả trước Linq, bạn nghĩ rằng họ sẽ muốn sử dụng generics (đã được giới thiệu tất cả các con đường trở lại trong C# 2 tôi tin)

Dường như tôi chạy qua các loại bộ sưu tập ít gây phiền nhiễu mọi lúc. Có lý do kỹ thuật nào không?

+19

Họ đã được giới thiệu trước Generics đã có sẵn. –

+4

Bạn có thể sử dụng kỹ thuật LINQ "ngoài hộp" bằng cách sử dụng 'OfType' hoặc' Cast' nếu tập hợp có xu hướng chứa loại mạnh, miễn là ít nhất là triển khai 'IEnumerable' (không chung chung). 'OfType' /' Cast' mang lại các trường hợp chung chung "IEnumerable ' và do đó mở phần còn lại của toán tử LINQ. –

+0

Và từ lâu tôi đã sử dụng ArrayList. – deerchao

Trả lời

7

Câu trả lời nằm trong tiêu đề câu hỏi: "bộ sưu tập có tên". Đó là cách bạn phải làm cho các bộ sưu tập loại an toàn trước khi generics trở nên có sẵn. Có rất nhiều người trong số họ trong mã ngày trở lại .NET 1.x, đặc biệt là Winforms. Không có cách nào hợp lý để viết lại chúng bằng cách sử dụng Generics, mà có thể đã phá vỡ quá nhiều mã hiện có.

Vì vậy, loại bộ sưu tập được đặt tên là loại an toàn nhưng chà là System.Collections.IEnumerator.Current, thuộc tính của loại Đối tượng. Bạn có thể Linqify những bộ sưu tập này bằng cách sử dụng OfType() hoặc Cast().

1

Như Adam Houldsworth đã nói trong một nhận xét, bạn chỉ cần sử dụng phương thức Cast <>.

Ví dụ:

var a = new DogCollection(); 
var allFidos = a.Cast<Dog>().Where(d => d.Name == "Fido"); 
Các vấn đề liên quan