2013-03-08 13 views
6
var multiples = from i in Enumerable.Range(min, (max - min)) 
         from r in roots 
         where i % r == 0 
         select i; 

Örneğin, roots = {2,10} ise 20 seçeneğini iki kez seçer.C# Kopyalardan kaçınmaya çalışılıyor

Burada kopyalardan kaçınmak mümkün mü?

+0

kullanın. –

cevap

8

katılmak:

var multiples = from i in Enumerable.Range(min, (max - min)) 
       where roots.Any(r => i % r == 0) 
       select i; 

Bu Bulduğu en kısa sürede roots test eleman silinir avantajına sahiptir Bu başarılı olur ve farklı öğeleri çıkarmak için ikinci bir geçiş gerektirmez. Eğer `multiples.Distinct()` sonradan, çiftleri ihtiva etmeyeceğini kullanırsanız

+1

Şüphesiz bu, bu durumda .Distinct() 'dan daha akıllıdır. –

+0

tam olarak aradığım şey bu! çok havalı! – user1376243

+0

@JeppeStigNielsen Oh evet. İyiydi. Bu, soruda ne yapıldığını düşünmek zaman alırsa ne olur. –

11

Kullanım Bu string ve int gibi basit türlerinde iyi çalışıyor Distinct

var multiples = (from i in Enumerable.Range(min, (max - min)) 
       from r in roots 
       where i % r == 0 
       select i).Distinct(); 

. anonim türlerde pek iyi değil.

Sizin durumunuzda i bir int'dur ve bu nedenle, yayınları sıralamak için uygun olmalıdır.

DÜZENLEME

O (Jeppe yorumuna bakınız) infact anonim türleri ile çalışan yapar. Çünkü @Jeppe, anonim türlerin, nesnelerin eşit/cumhuriyetler olup olmadığını belirlemek için Distict kodlamasını içeren "iyi" bir Equals olduğunu söyledi. Bunun yerine tam Kartezyen Any() kullanabilirsiniz

+0

Cevabınız için çok teşekkür ederim! – user1376243

+1

@ user1376243 Lütfen sorgunuzu çözmesi durumunda onay işaretini tıklayarak cevabı kabul edin. –

+5

Siz: anonim tiplerde çok iyi değil. Bu ('.Distinct()') anonim tipteki her bir özelliğin türünün "iyi" 'Eşittir ve GetHashCode 'uygulamalarına sahip olması koşuluyla anonim tiplerde harika çalışır. Anonim tipte (otomatik olarak) "Eşit" ve "koordinat-bilge" eşitlik karşılaştırması uygulayan "GetHashCode" olacaktır. –

4

Kullanım DISTINCT

var multiples = (from i in Enumerable.Range(min, (max - min)) 
         from r in roots 
         where i % r == 0 
         select i).Distinct(); 
1

Distinct() Yöntem

var multiples = (from i in Enumerable.Range(min, (max - min)) 
       from r in roots 
       where i % r == 0 
       select i).Distinct(); 
İlgili konular