C#试图避免重复

时间:2013-03-08 06:49:24

标签: c# linq

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 个答案:

答案 0 :(得分:10)

使用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,因此应该巧妙地整理出来。

修改

确实 infact适用于匿名类型(请参阅Jeppe的评论)。因为正如@Jeppe所说的那样,匿名类型有一个“好”EqualsDistict能够确定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();