2013-07-15 31 views
6

Một số thời gian trước đây, tôi đã làm việc trên một dự án khá xoắn - Tôi chỉ có thể viết mã trong phạm vi duy nhất và sau đó nó sẽ được đặt trong một hàm C# (bởi một mô-đun khác).Có thể sử dụng LINQ và lambdas mà không bao gồm không gian tên System.Linq không?

Tôi chỉ có thể sử dụng các không gian tên đã được khai báo trước đó (tôi không có ảnh hưởng đến chúng) và chỉ có thể sử dụng các biến từ phạm vi mà tôi đã làm việc. Do đó, tôi không thể thay đổi tiêu đề và thư viện được bao gồm .

Sự cố xảy ra khi tôi muốn hoạt động trên bộ sưu tập chung - tôi không thể sử dụng cả biểu thức lambda, cũng không phải LINQ - Tôi không đơn giản là có thể đặt using System.Linq; vì tôi không có quyền truy cập vào tiêu đề tệp.

Tôi phải làm một điều đơn giản và dễ quản lý mà không có LINQ hoặc lambda. Tuy nhiên, sau đó tôi đã tự hỏi điều gì sẽ xảy ra, nếu tôi phải sử dụng một số hoạt động phức tạp hơn trên IEnumerable . Từ đó, có câu hỏi của tôi:

Có thể sử dụng LINQ hoặc lambdas mà không thay đổi tiêu đề tệp và thêm không gian tên mới không?

Giả sử chúng tôi có List<int> _Numbers = new List<int>();. Hãy để nó được làm đầy với một số con số. Bây giờ tôi muốn chọn tất cả các số chẵn từ đó.

Với using System.Linq; trong tiêu đề, giải pháp là rõ ràng:

List<int> _NewList = _Numbers.Where(n => n % 2 == 0).ToList(); 

hoặc

List<int> _NewList = (from _Number in _Numbers where _Number % 2 == 0 select _Number).ToList(); 

Nhưng mà không LINQ bao gồm, làm thế nào tôi có thể đạt được điều này? đoán đầu tiên của tôi sẽ là một cái gì đó như:

List<int> _NewList = System.Linq. // ??? What to add here? 

Tôi biết rằng vấn đề là khá kỳ lạ, và nó rất bất thường để đi theo con đường này, nhưng tôi chỉ tò mò và tôi đã không tìm thấy thông tin về vấn đề này trường hợp.

+1

'System.Linq.Enumerable.Where (_NewList, n => n% 2 == 0)' –

+0

@nsinreal - cảm ơn, đó là chính xác những gì tôi đang tìm kiếm. Thêm câu trả lời đó và tôi sẽ đánh dấu nó là chính xác;) –

+0

Bạn cũng có thể bao gồm các câu lệnh 'using' trong khai báo không gian tên của lớp. Đó có phải là bên ngoài phạm vi bạn có quyền truy cập không? – Sam

Trả lời

15

Nếu không có chỉ thị using, các phương pháp như .Where, .Select, sẽ không giải quyết được. Điều đó có nghĩa là LINQ phần ngôn ngữ sẽ không hoạt động. Bạn sẽ phải mã nó dài tay (và ngược!):

List<int> _NewList = System.Linq.Enumerable.ToList(
    System.Linq.Enumerable.Where(_Numbers, _Number => _Number % 2 == 0) 
); 

Lưu ý rằng điều này trở nên ngày càng phức tạp cho các ví dụ còn với các nhóm, đơn đặt hàng, "chúng ta hãy" s, tham gia vv Trừ khi bạn đang làm một cái gì đó khá đơn giản, bạn nên tìm cách thêm chỉ thị using.

Lưu ý, tuy nhiên, nếu _Numbers là một List<T>, bạn chỉ có thể sử dụng (ví dụ đơn này):

List<int> _NewList = _Numbers.FindAll(_Number => _Number % 2 == 0); 
+0

Cảm ơn, nó đã giải thích rất nhiều. Tôi biết về FindAll(), nhưng theo như tôi biết, nó chỉ hoạt động với Danh sách, và tôi đang tìm cách phổ quát hơn. –

2

Không phải rất rõ ràng lý do tại sao bạn không thể truy cập vào tập tin "tiêu đề", nhưng nếu vấn đề mà bạn không thể gõ vào đầu của tập tin using dirrective, bạn thể vẫn sử dụng đầy đủ tên đủ của các loại, như:

System.Linq.Enumerable(...) 

Để thực hiện công việc này, bạn cần phải bao gồm cả các tham chiếu chính xác.

Nếu đây không phải là những gì bạn đang yêu cầu, vui lòng làm rõ.

+1

Tôi không thể truy cập vào tiêu đề tệp, đó là vấn đề của APi mà tôi đang làm việc. Tôi biết rằng tôi có thể thêm System.Linq. trong phạm vi, nhưng tôi không biết làm thế nào để đánh giá nó hơn nữa. –

3

Bạn có thể viết mã như:

System.Linq.Enumerable.Where(_NewList, n => n % 2 == 0) 

Nhưng, hãy cẩn thận : nếu lớp của bạn triển khai giao diện IQueryable<T>, mã ở trên sẽ thực hiện công việc nhưng chậm hơn.

System.Linq.Queryable.Where(_NewList, n => n % 2 == 0) 

Vì cách IQueryable là cách tạo C# bằng ngôn ngữ DSL khác, như SQL. Với các điều kiện where khác, máy chủ SQL của bạn có thể chọn các yếu tố cần thiết nhanh nhất có thể. Nhưng nếu bạn làm việc với IEnumerable hoặc System.Linq.Enumerable không có tối ưu hóa ở phía máy chủ, bạn sẽ có một danh sách đầy đủ các mục, tất cả chúng sẽ được tải vào bộ nhớ và được lọc trong bộ nhớ.

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