2013-03-08 85 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();