2009-03-30 21 views
6

Tôi hiện đang thực hiện một số vấn đề về Dự án Euler và các câu hỏi trước đó thường liên quan đến những thứ như số Fibonacci hoặc số nguyên tố. Lặp lại chúng dường như là một sự phù hợp tự nhiên đối với LINQ, ít nhất là trong khả năng đọc và cảm nhận "sự thanh lịch" của mã (Tôi đang cố gắng sử dụng các tính năng dành riêng cho ngôn ngữ nếu có thể và có thể áp dụng để cảm nhận ngôn ngữ).Truy vấn LINQ trên các danh sách có thể vô hạn

Vấn đề của tôi bây giờ là, nếu tôi chỉ cần một tập hợp các con số lên đến một giới hạn nhất định, tôi nên thể hiện điều này như thế nào? Hiện tại tôi đã mã hóa cứng giới hạn tương ứng trong trình lặp nhưng tôi thực sự thích điều tra viên trả về danh sách cho đến khi một cái gì đó bên ngoài quyết định không truy vấn nó nữa, vì nó vượt quá giới hạn nhất định. Vì vậy, về cơ bản mà tôi có một iterator vô hạn tiềm năng nhưng tôi chỉ mất một tập hữu hạn các số từ nó. Tôi biết những điều như vậy là tầm thường trong các ngôn ngữ chức năng, nhưng tôi tự hỏi liệu C# có cho phép điều đó không. Ý tưởng khác duy nhất tôi đã có sẽ là có một số nguyên tố vòng lặp (dài) trả về số nguyên tố lên đến một giới hạn nhất định, tương tự như vậy đối với các trình tự khác.

Bất kỳ ý tưởng nào?

Trả lời

10

Hầu hết các phương pháp LINQ (Lớp được liệt kê) đều lười. Vì vậy, ví dụ, không có gì sai với:

var squares = Enumerable.Range(0, Int32.MaxValue).Select(x=>x*x); 

Bạn có thể sử dụng phương pháp áp dụng để giới hạn kết quả:

var 10squares = squares.Take(10); 

var smallSquares = squares.TakeWhile(x => x < 10000); 

Edit: Những điều bạn cần tránh là chức năng mà trở về "uể oải "nhưng phải tiêu thụ toàn bộ số đếm để tạo ra kết quả. Ví dụ, nhóm hoặc sắp xếp:

var oddsAndEvens = Enumerable.Range(0, Int32.MaxValue) 
          .GroupBy(x => x % 2 == 0); 
foreach (var item in oddsAndEvens) { 
    Console.WriteLine(item.Key); 
} 

(Điều đó có thể sẽ cung cấp cho bạn một OutOfMemoryExeption trên 32-bit).

+0

Ah, ok, không biết TakeWhile cho đến nay. Tôi chỉ nghĩ rằng sử dụng ở đâu để chọn những con số tôi muốn sẽ không làm việc như LINQ không có ý tưởng rằng các con số đang gia tăng, ví dụ. Nghe có vẻ hay đấy, thực sự :) – Joey

+0

+1, tóm tắt hay. Tôi cũng đã cố gắng xây dựng một chút về chủ đề này: http://blog.casualdev.net/2009/10/linq-and-infinite-enumerations.html –

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