2010-05-10 27 views

Trả lời

10

Bạn có thể sử dụng LINQ với bất kỳ IEnumerable nào bằng cách sử dụng chức năng Cast<T>() hoặc chức năng OfType<T>(). Nếu bạn tin rằng IEnumerable chỉ chứa các đối tượng thuộc một loại cụ thể thì Cast<T>() sẽ nhanh hơn một chút.

Ví dụ,

ArrayList foo = new ArrayList(); 

foo.Add("bar"); 
foo.Add("baz"); 

var bar = foo.Cast<string>().Select(s => s.ToUpper()); 

Có rất nhiều các lớp học hiện có (như ArrayList) đã tồn tại trước sự ra đời của Generics trong .NET, vì vậy họ vẫn đều là phòng không chung.

+0

Làm thế nào nhiều của một hit hiệu suất này sẽ được? –

+0

@Chris: Rất ít với 'Cast', và chỉ rất nhỏ với' OfType' (kể từ khi kiểm tra kiểu được thực hiện hai lần). –

2

Các lớp này thường có ngày từ trước khi có generics trong .net nhiều lớp như vậy có chung equievelents nhưng không phải tất cả. Cũng có cách giải quyết khác. ví dụ. với linq bất kỳ bộ sưu tập không chung chung nào có thể được tạo thành linqy và generic bằng cách sử dụng các phương thức mở rộng .Cast() và .OfType().

+0

+1 để sử dụng "linqy" –

+0

Linqy là một từ tốt, buti thích cái được đặt ra bởi một đồng nghiệp sau khi thêm một nhóm UpdatePanels vào trang asp.net của mình. Ông tuyên bố ông đã chỉ "ajaxified" trang của mình ;-) –

2

Hãy nhớ rằng nhiều loại BCL mà chúng tôi đang sử dụng là từ thời điểm trước khi generics, đến 2.0. Tuy nhiên, bạn vẫn có thể sử dụng LINQ với nhiều người trong số họ, bạn chỉ cần làm thêm một chút công việc.

ArrayList arrayList = new ArrayList(); 
arrayList.Add(1); 
arrayList.Add(2); 

var query = from item in arrayList.OfType<int>() select item; 
+2

Điều này sẽ * lọc * các phần tử trong ArrayList để chỉ những phần tử thuộc loại int. –

12

Vấn đề lịch sử. Generics không phải lúc nào cũng tồn tại, vì vậy bạn có thể gặp phải các lớp và các API được thiết kế trước sự ra đời của Generics.

Ngoài ra, đối tượng mục tiêu quan trọng. Một số tính năng đang nhắm mục tiêu một khán giả nhà phát triển có thể có problems understanding generics:

cân bằng: API sử dụng một số tính năng tiên tiến Generics có thể quá khó sử dụng đối với một số nhà phát triển. Khái niệm Generics không được rộng rãi được hiểu, trong một số trường hợp, cú pháp có thể gây ra vấn đề, và bất kỳ tính năng mới nào, Generics có thể đặt ra một đường cong học tập quan trọng cho một số nhà phát triển cấp độ .

Có, báo giá là từ năm 2004, nhưng một số, nếu không phải hầu hết API .Net bạn sử dụng hôm nay đều ra mắt vào năm 2005, vì vậy báo giá thực sự rất phù hợp.

+2

+1 Trong các cuộc thảo luận trước đó với các nhân viên MS, họ rất kín đáo để thực hiện các thay đổi đột phá đối với các API công cộng (hoặc thậm chí các thay đổi phụ thêm vào giao diện - vì điều này sẽ phá vỡ các trình triển khai giao diện hiện tại).Nếu bạn là người tiêu dùng thuần túy, âm thanh giống như nỗi đau trong ass, nhưng khi bạn ở vị trí của họ (sản xuất API để tiêu thụ của người khác), bạn nhanh chóng bắt đầu đồng cảm và làm theo các thực hành tương tự vì nó giúp cuộc sống của bạn dễ dàng hơn và tạo điều kiện cho việc áp dụng nhanh hơn các phiên bản mới hơn, được hỗ trợ tốt hơn. –

Các vấn đề liên quan