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

例如,如果roots = {2,10}它会选择20两次。

是否可以在这里避免重复?

4

4 回答 4

10

使用不同的

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,因此它应该能够整理出重复项。

编辑

确实适用于匿名类型(请参阅 Jeppe 的评论)。因为正如@Jeppe 所说,匿名类型具有“良好”Equals特性Distict,可以确定 to 对象是否相等/重复。

于 2013-03-08T06:52:09.733 回答
8

您可以使用Any()而不是完整的笛卡尔连接:

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

这还有一个额外的好处,即roots一旦找到成功的元素,它将立即停止测试元素,并且不需要第二次通过即可提取不同的元素。

于 2013-03-08T06:56:06.897 回答
3

使用DISTINCT

var multiples = (from i in Enumerable.Range(min, (max - min))
                        from r in roots
                        where i % r == 0
                        select i).Distinct();
于 2013-03-08T06:52:41.387 回答
1

请使用Distinct()方法

var multiples = (from i in Enumerable.Range(min, (max - min))
                 from r in roots
                 where i % r == 0
                 select i).Distinct();
于 2013-03-08T06:59:38.960 回答