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

例如,如果roots = {2,10}它會選擇20兩次。C#試圖避免重複

在這裏可以避免重複嗎?

+0

如果你使用'multiples.Distinct()'之後,將不包含重複。 – 2013-03-08 06:52:44

回答

8

可以使用Any(),而不是一個完整的笛卡兒連接:

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

這有額外的好處,它會在roots儘快停止測試部分,因爲它找到一個成功,並且不需要第二次傳遞就可以提取不同的元素。

+1

在這種情況下,它確實比'.Distinct()'聰明。 – 2013-03-08 07:00:27

+0

這就是我正在尋找的!很酷! – user1376243 2013-03-08 07:02:18

+0

@JeppeStigNielsen噢。一個好的。當人們需要時間來真正思考在問題中正在做什麼時,會發生這種情況。 – 2013-03-08 07:08:01

11

使用Distinct

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

這非常適用於簡單的類型,如stringint 匿名類型不太好。

在你的情況下,i是一個int,因此它應該很好地解決dublicates。

編輯

確實 INFACT適用於匿名類型(見葉普的評論)。因爲@Jeppe說匿名類型有一個「好」Equals enabeling Distict來確定對象是否相等/ dublicates。

+0

非常感謝您的回答! – user1376243 2013-03-08 07:00:19

+1

@ user1376243如果解決了您的查詢,請點擊勾號接受答案。 – 2013-03-08 07:05:28

+5

你:對匿名類型不太適用它('.Distinct()')在匿名類型上效果很好,只要anonumous類型的每個屬性的類型都是一個帶有「good」'Equals'和'GetHashCode'實現的類型。匿名類型將(自動)具有「Equals」和「GetHashCode」,它們實現了「座標式」的相等比較。 – 2013-03-08 07:15:16

4

使用DISTINCT

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

請使用Distinct()方法

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