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


    范型在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


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

  • 相关阅读:
    yum源的制作
    债券到期收益率计算公式
    IMP同库Type对象导入报错ORA-02304
    oracle自动挂掉问题分析
    CPP读取dbf文件
    oracle忘记system密码
    沪C转浙A
    业务词汇
    VS2017使用Resharp开发CPP程序
    CPP调用webservice
  • 原文地址:https://www.cnblogs.com/bradwarden/p/3364223.html
Copyright © 2020-2023  润新知