var multiples = from i in Enumerable.Range(min, (max - min))
from r in roots
where i % r == 0
select i;
例如,如果roots = {2,10}
,则会选择20
两次。
这里可以避免重复吗?
答案 0 :(得分:10)
使用Distinct
var multiples = (from i in Enumerable.Range(min, (max - min))
from r in roots
where i % r == 0
select i).Distinct();
这适用于string
和int
等简单类型。 在匿名类型上不是很好。
在你的情况下,i
是一个int
,因此应该巧妙地整理出来。
修改强>
确实 infact适用于匿名类型(请参阅Jeppe的评论)。因为正如@Jeppe所说的那样,匿名类型有一个“好”Equals
让Distict
能够确定to对象是否相等/相似。
答案 1 :(得分:8)
您可以使用Any()
代替完整的笛卡尔联接:
var multiples = from i in Enumerable.Range(min, (max - min))
where roots.Any(r => i % r == 0)
select i;
这有一个额外的好处,它会在找到成功的元素后立即停止在roots
中测试元素,并且不需要第二次传递来拉出不同的元素。
答案 2 :(得分:3)
使用DISTINCT
var multiples = (from i in Enumerable.Range(min, (max - min))
from r in roots
where i % r == 0
select i).Distinct();
答案 3 :(得分:1)
请使用Distinct()
方法
var multiples = (from i in Enumerable.Range(min, (max - min))
from r in roots
where i % r == 0
select i).Distinct();