2009-03-30 18 views
6

Şu anda bazı Project Euler problemleri yapıyorum ve daha önce Fibonacci sayıları veya primleri gibi şeyleri içerir. Onları yinelemek LINQ için doğal bir uyum gibi görünüyor, en azından okunabilirlik ve kodun "zarafeti" olarak algılanıyor (dilleri mümkün kılacak ve dil için bir fikir edinmek için dil özelliklerini kullanıyorum).LINQ, muhtemelen sonsuz listelerde sorgular

Sorunum şu ki, yalnızca belirli bir sınıra kadar bir sayı kümesine ihtiyacım varsa, bunu en iyi nasıl ifade edebilirim? Şu anda yineleyicideki ilgili limiti kodladım ancak listeyi döndürmek istemiyorum, dışarıdan bir şey sorgulamaya karar verene kadar, belli bir sınırın üzerinde. Yani temelde potansiyel olarak sonsuz bir yineleyicim var, ama sadece ondan sonlu bir dizi sayı alıyorum. Bu tür şeylerin işlevsel dillerde önemsiz olduğunu biliyorum, ama C#'nin buna da izin verip vermediğini merak ediyorum. Diğer tek fikir, diğer sekanslar için de benzer şekilde belirli bir sınıra kadar primleri döndüren bir yineleyici Primes (uzun) olmalıdır.

Herhangi bir fikrin var mı?

cevap

10

LINQ yöntemlerinin çoğu (Enumerable sınıfı) tembeldir. Yani örneğin, yanlış bir şey vardır:

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

Sonuçlara sınırlamak için alın yöntemi kullanabilirsiniz: Eğer kaçınmak gerekir şeyler vardır tembel" döndüren işlevler:

var 10squares = squares.Take(10); 

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

Düzenleme "Ancak sonuç üretmek için sayısız olanı tüketmek zorundadır. Örneğin, gruplama veya sıralama:

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

(Muhtemelen size 32-bit bir OutOfMemoryExeption vereceğiz.)

+0

Ah, tamam, şu ana kadar TakeWhile bilmiyordum. İstediğim numaraları seçmek için Nerede kullanılmasının LINQ gibi sayılmayacağını, örneğin sayıların arttığını düşünmüyordum. Bu gerçekten kulağa hoş geliyor :) – Joey

+0

+1, güzel bir özet. Ayrıca bu konu hakkında biraz bilgi vermeye çalıştım: http://blog.casualdev.net/2009/10/linq-and-infinite-enumerations.html –