2013-05-14 166 views
3

在我当前的LINQ查询结束时,我有一些数据,其格式为IEnumerable<IEnumerable<int>>,有几个重复的组合。在枚举枚举中调用.Distinct()

例如:

{ 
    {5, 20} 
    {5, 20} 
    {10, 15} 
} 

什么使每套仅代表一次过滤这些最好的方法是什么? LINQ答案是理想的,所以我可以进一步链接它。

+4

您需要一个'IEqualityComparer >'。 – SLaks 2013-05-14 18:01:26

+2

你如何定义“平等”?订单是否重要? – 2013-05-14 18:01:54

+0

@DStanley - 它没有 - 我在进行这一步之前正在对数据进行排序,但是如果相等性测试可以以无序的方式处理它,我可以稍微拿出一点。 – Bobson 2013-05-14 18:03:21

回答

5

如果您创建一个序列的相等比较如下:

class SequenceEqualityComparer<T> : IEqualityComparer<IEnumerable<T>> { 
    public bool Equals(IEnumerable<T> a, IEnumerable<T> b) { 
     if (a == null) return b == null; 
     if (b == null) return false; 
     return a.SequenceEqual(b); 
    } 

    public int GetHashCode(IEnumerable<T> val) { 
     return val.Where(v => v != null) 
       .Aggregate(0, (h, v) => h^v.GetHashCode()); 
    } 
} 

然后,您可以拨打.Distinct(new SequenceEqualityComparer<int>())

+1

写得很好,太遗憾了,遗漏了空检查。 – Jon 2013-05-14 18:10:18

+0

@Jon - 这对我的场景来说不是问题,但对于任何稍后使用此代码的人来说,这是一个非常好的选择。 – Bobson 2013-05-14 18:11:37

+0

@Bobson:请注意,这是订单感知。 – SLaks 2013-05-14 18:11:57