使用代理实现对C# list distinct操作

系统 1746 0

范型在c#编程中经常使用,而经常用list 去存放实体集,因此会设计到对list的各种操作,比较常见的有对list进行排序,查找,比较,去重复。而一般的如果要对list去重复如果使用linq distinct方式,会遇到一些坑爹的问题,发现结果集中还是存在重复数据,原因是使用这种方法是对对象的引用去重复,并不满足我们的需求。因此本文通过c#代理的方式实现对list distinct操作。

先介绍一下对list去重复传统的方法,代码如下:

      List<ReviewersReport> reportList=
      
        GetReportList();


      
      
        for
      
       (
      
        int
      
       i = 
      
        0
      
      ; i < reportList.Count; i++
      
        )

            {

                
      
      
        for
      
       (
      
        int
      
       j = i + 
      
        1
      
      ; j < reportList.Count; j++
      
        )

                {

                    
      
      
        if
      
      
         (reportList[i].Equals(reportList[j]))

                    {

                        reportList.RemoveAt(reportList.LastIndexOf(reportList[i]));

                        j
      
      --
      
        ;

                    }

                }

            }
      
    

通过这种方式对list 实现distinct操作显然比较麻烦,如果还有其他的list实体集也需要实现类似的功能,那我们就会为代码的可重用性担心了。

 

下面使用简单高效的方式去实现list的distinct功能,也是本文推荐的方式了

先创建一个Compare类,如下:

      
        public
      
      
        delegate
      
      
        bool
      
       EqualsComparer<T>
      
        (T x, T y);

    
      
      
        public
      
      
        class
      
       Compare<T> : IEqualityComparer<T>
      
        

    {

        
      
      
        private
      
       EqualsComparer<T>
      
         _equalsComparer;



        
      
      
        public
      
       Compare(EqualsComparer<T>
      
         equalsComparer)

        {

            
      
      
        this
      
      ._equalsComparer =
      
         equalsComparer;

        }



        
      
      
        public
      
      
        bool
      
      
         Equals(T x, T y)

        {

            
      
      
        if
      
       (
      
        null
      
       != 
      
        this
      
      
        ._equalsComparer)

                
      
      
        return
      
      
        this
      
      
        ._equalsComparer(x, y);

            
      
      
        else
      
      
        return
      
      
        false
      
      
        ;

        }

        
      
      
        public
      
      
        int
      
      
         GetHashCode(T obj)

        {

            
      
      
        return
      
      
         obj.ToString().GetHashCode();

        }

}
      
    

这里在构造器中传递一个delegate,调用者可以在这个delegate定义比较规则,这样具有了极大的灵活性,我们可以注意到Compare实现了IEqualityComparer接口来自定义比较对象,判断两个对象是否相等。使用方式如下:

      ist<ReviewersReport> requestList =
      
        Get RequestList ();

requestList 
      
      =requestList.Distinct(
      
        new
      
       Compare<Requestor>((x, y) => (
      
        null
      
       != x && 
      
        null
      
       != y) && (x.RequestorName.Equals(y.RequestorName)))).ToList();
    

用这种方式大大的扩展了比较器的使用范围,增加了代码的可重用性,可以适用于任何对象的比较。

比较后我们可以对起进行排序,使代码也很简洁。

        requestList.Sort(
        
          delegate
        
        (Requestor r1, Requestor r2) { 
        
          return
        
         r1.RequestorCSL.CompareTo(r2.RequestorCSL); });
      
View Code


希望对园友们有所帮助。。。

 

 

 

 

 

 

 

使用代理实现对C# list distinct操作


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论