.net Distinct 去重问题分析

问题:.net中的distinct方法对于自定义的类(class model )去重时失效。问题分析:

model1:

1  public class TestModel1
2     {
3         public int Id { get; set; }
4         public string Name { get; set; }
5         public string Address { get; set; }
6     }

model2:

 public class TestModel2
    {
        protected bool Equals(TestModel2 other)
        {
            return Id == other.Id && string.Equals(Name, other.Name) && string.Equals(Address, other.Address);
        }

        public override int GetHashCode()
        {
            unchecked
            {
                int hashCode = Id;
                hashCode = (hashCode*397) ^ (Name != null ? Name.GetHashCode() : 0);
                hashCode = (hashCode*397) ^ (Address != null ? Address.GetHashCode() : 0);
                return hashCode;
            }
        }

        public int Id { get; set; }
        public string Name { get; set; }
        public string Address { get; set; }
        public override bool Equals(object obj)
        {
            if (ReferenceEquals(null, obj)) return false;
            if (ReferenceEquals(this, obj)) return true;
            if (obj.GetType() != this.GetType()) return false;
            return Equals((TestModel2) obj);
        }
    }

Model3:

 public class TestModel3
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Address { get; set; }

    }

    public class ListTestModel3 : IEqualityComparer<TestModel3>
    {
        public bool Equals(TestModel3 x, TestModel3 y)
        {
            if (x.Id == y.Id && x.Name == y.Name && x.Address == y.Address)
            {
                return true;
            }
            return false;
        }

        public int GetHashCode(TestModel3 obj)
        {
            return 0;
        }
    }

主程序:

  1   public partial class Form1 : Form
  2     {
  3         public Form1()
  4         {
  5             InitializeComponent();
  6             InitData();
  7
  8         }
  9
 10         private void InitData()
 11         {
 12
 13             var model1s = new List<TestModel1>();
 14             var model2s = new List<TestModel2>();
 15             var model3s = new List<TestModel3>();
 16             for (int i = 0; i < 3; i++)
 17             {
 18                 var model1 = new TestModel1()
 19                     {
 20                         Id = 10001,
 21                         Name = "张三",
 22                         Address = "中国-上海"
 23                     };
 24                 var model2 = new TestModel2()
 25                     {
 26                         Id = 10001,
 27                         Name = "张三",
 28                         Address = "中国-上海"
 29                     };
 30                 var model3 = new TestModel3()
 31                     {
 32                         Id = 10001,
 33                         Name = "张三",
 34                         Address = "中国-上海"
 35                     };
 36                 model1s.Add(model1);
 37                 model2s.Add(model2);
 38                 model3s.Add(model3);
 39             }
 40
 41             for (int i = 0; i < 3; i++)
 42             {
 43                 var model1 = new TestModel1()
 44                     {
 45                         Id = 10002,
 46                         Name = "张三",
 47                         Address = "中国-上海"
 48                     };
 49                 var model2 = new TestModel2()
 50                     {
 51                         Id = 10002,
 52                         Name = "张三",
 53                         Address = "中国-上海"
 54                     };
 55                 var model3 = new TestModel3()
 56                     {
 57                         Id = 10002,
 58                         Name = "张三",
 59                         Address = "中国-上海"
 60                     };
 61                 model1s.Add(model1);
 62                 model2s.Add(model2);
 63                 model3s.Add(model3);
 64             }
 65             for (int i = 0; i < 3; i++)
 66             {
 67                 var model1 = new TestModel1()
 68                     {
 69                         Id = 10001,
 70                         Name = "李四",
 71                         Address = "中国-上海"
 72                     };
 73                 var model2 = new TestModel2()
 74                     {
 75                         Id = 10001,
 76                         Name = "李四",
 77                         Address = "中国-上海"
 78                     };
 79                 var model3 = new TestModel3()
 80                     {
 81                         Id = 10001,
 82                         Name = "李四",
 83                         Address = "中国-上海"
 84                     };
 85                 model1s.Add(model1);
 86                 model2s.Add(model2);
 87                 model3s.Add(model3);
 88             }
 89             for (int i = 0; i < 3; i++)
 90             {
 91                 var model1 = new TestModel1()
 92                     {
 93                         Id = 10002,
 94                         Name = "李四",
 95                         Address = "中国-上海"
 96                     };
 97                 var model2 = new TestModel2()
 98                     {
 99                         Id = 10002,
100                         Name = "李四",
101                         Address = "中国-上海"
102                     };
103                 var model3 = new TestModel3()
104                     {
105                         Id = 10002,
106                         Name = "李四",
107                         Address = "中国-上海"
108                     };
109                 model1s.Add(model1);
110                 model2s.Add(model2);
111                 model3s.Add(model3);
112             }
113             var model4s = (from m in model1s
114                            select new TestModel1
115                                {
116                                    Id = m.Id,
117                                    Name = m.Name,
118                                    Address = m.Address
119                                }).ToList().Distinct();
120             dataGridView1.DataSource = model1s;
121             dataGridView2.DataSource = model2s;
122             dataGridView3.DataSource = model3s;
123             dataGridView4.DataSource = model4s.ToList(); ;
124         }
125
126         private void InitDistinctData()
127         {
128
129             var model1s = new List<TestModel1>();
130             var model2s = new List<TestModel2>();
131             var model3s = new List<TestModel3>();
132             for (int i = 0; i < 3; i++)
133             {
134                 var model1 = new TestModel1()
135                     {
136                         Id = 10001,
137                         Name = "张三",
138                         Address = "中国-上海"
139                     };
140                 var model2 = new TestModel2()
141                     {
142                         Id = 10001,
143                         Name = "张三",
144                         Address = "中国-上海"
145                     };
146                 var model3 = new TestModel3()
147                     {
148                         Id = 10001,
149                         Name = "张三",
150                         Address = "中国-上海"
151                     };
152                 model1s.Add(model1);
153                 model2s.Add(model2);
154                 model3s.Add(model3);
155             }
156
157             for (int i = 0; i < 3; i++)
158             {
159                 var model1 = new TestModel1()
160                     {
161                         Id = 10002,
162                         Name = "张三",
163                         Address = "中国-上海"
164                     };
165                 var model2 = new TestModel2()
166                     {
167                         Id = 10002,
168                         Name = "张三",
169                         Address = "中国-上海"
170                     };
171                 var model3 = new TestModel3()
172                     {
173                         Id = 10002,
174                         Name = "张三",
175                         Address = "中国-上海"
176                     };
177                 model1s.Add(model1);
178                 model2s.Add(model2);
179                 model3s.Add(model3);
180             }
181             for (int i = 0; i < 3; i++)
182             {
183                 var model1 = new TestModel1()
184                     {
185                         Id = 10001,
186                         Name = "李四",
187                         Address = "中国-上海"
188                     };
189                 var model2 = new TestModel2()
190                     {
191                         Id = 10001,
192                         Name = "李四",
193                         Address = "中国-上海"
194                     };
195                 var model3 = new TestModel3()
196                     {
197                         Id = 10001,
198                         Name = "李四",
199                         Address = "中国-上海"
200                     };
201                 model1s.Add(model1);
202                 model2s.Add(model2);
203                 model3s.Add(model3);
204             }
205             for (int i = 0; i < 3; i++)
206             {
207                 var model1 = new TestModel1()
208                     {
209                         Id = 10002,
210                         Name = "李四",
211                         Address = "中国-上海"
212                     };
213                 var model2 = new TestModel2()
214                     {
215                         Id = 10002,
216                         Name = "李四",
217                         Address = "中国-上海"
218                     };
219                 var model3 = new TestModel3()
220                     {
221                         Id = 10002,
222                         Name = "李四",
223                         Address = "中国-上海"
224                     };
225                 model1s.Add(model1);
226                 model2s.Add(model2);
227                 model3s.Add(model3);
228             }
229             var model4s = (from m in model1s
230                            select new
231                            {
232                                Id = m.Id,
233                                Name = m.Name,
234                                Address = m.Address
235                            }).ToList().Distinct();
236             dataGridView1.DataSource = model1s.Distinct().ToList();
237             dataGridView2.DataSource = model2s.Distinct().ToList();
238             dataGridView3.DataSource = model3s.Distinct(new ListTestModel3()).ToList();
239             dataGridView4.DataSource = model4s.ToList();
240         }
241
242         private void button1_Click(object sender, EventArgs e)
243         {
244             InitDistinctData();
245
246         }

过滤前结果:

过滤后结果:

分析:model1不管过滤前和过滤后均没有去重,model2 重写了Equals 和GetHashCode两个方法,过滤前后结果不一样, model3实现了IEqualityComparer接口进行了Distinct时重写Equals 和GetHashCode两个方法。效果和model2是一样的。Model4,去重之前用的是自己定义的实体类,框架不知道相等的条件,顾虽然去重但是没有效果,过滤后Model4采用了匿名方法类,简单的匿名类型内部实际是键值对,框架内部使用默认的相等比较器对值进行比较,所以可以去重。

结论:自定义类无法实现多键值去重(Distinct),可以通过以上三种方法去实现。

Demo:下载

.net Distinct 去重问题分析,布布扣,bubuko.com

时间: 2024-11-03 21:04:07

.net Distinct 去重问题分析的相关文章

Distinct源码分析

以前比较两个List数据,筛选出所需要的数据时候,一直套两层for循环来执行.用到去重(Distinct)的时候,这两个需求其实都是一样的,都是需要比较两个集合,查看了下它的源码,里面确实有值得借鉴的地方. 先附上源码一直我调试的代码,大部分地方加上了注释 1 class Program 2 { 3 static void Main(string[] args) 4 { 5 //初始化集合 6 List<Point> points = new List<Point>() 7 { 8

关于Django中的数据库操作API之distinct去重的一个误传

关于Django中的数据库操作API之distinct去重的一个误传 最近在做一个Server的项目,后台框架是Apache mod_wsgi + django.django是一个基于Python的Web开发框架,功能十分强大,至于有多强大,还是读者们自己去体验吧.我在这里要说的一个问题是关于Python的ORM功能的.问题就在django提供的数据库操作API中的distinct()函数,了解SQL语句的读者都应该知道,DISTINCT关键字可以在select操作时去重.django里的这个d

List&lt;object&gt;进行Distinct()去重

原文:List<object>进行Distinct()去重 有时我们会对一个list<T>集合里的数据进行去重,C#提供了一个Distinct()方法直接可以点得出来.如果list<T>中的T是个自定义对象时直接对集合Distinct是达不到去重的效果.我们需要新定义一个去重的类并继承IEqualityComparer接口重写Equals和GetHashCode方法,如下Demo 1 using System; 2 using System.Collections.Ge

SQLSever 第二堂课,主要学习内容为top查询前多少行,distinct去重,order by排序,group by分组,最重要子查询

create database xuesheng drop database xusheng use xuesheng go create table xueshengxinxi ( code int primary key identity(1,1)not null, name varchar(50) not null, age int not null, sex varchar(50) not null, hight int not null, [weight] int not null,

存储过程系列三:根据表别名方式distinct去重插入

1.根据表别名方式distinct去重插入 insert into GG_XKZ_YLQXSCXKESL_SCDZ           ( bzj, xkzid,  sqid, jtdz, szsf, szqx, szjd, lxdh, yb, instnum, lastdate, datexc)     select  SYS_GUID(), new_xkz_idIn, a.* from    (select distinct   sqid, jtdz, szsf, szqx, szjd, l

in和exists的区别以及exists和distinct去重的区别?

小编相信大家都知道in和exists的区别:1.运用情况不同sql中in适用于子查询得出的结果集记录较少,主查询中的表较大且又有索引的表,.sql中exist适用于外层的主查询记录较少,子查询中的表大,又有索引的时候. 2.驱动顺序不同IN是先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选.exists是以外层表为驱动表,先被访问. 3.底层原理不同in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询. 但是我昨天看到

单表查询: where group by 分组 having distinct 去重 order by 排序 limit 多表查询 子查询 连表查询

今日内容 表查询 单表查询: where group by 分组 having distinct 去重 order by 排序 limit 多表查询 子查询 连表查询 单表查询 前期表准备 create table emp( id int not null unique auto_increment, name varchar(20) not null, sex enum('male','female') not null default 'male', #大部分是男的 age int(3) u

SQLSERVER去除某一列的重复值并显示所有数据\DISTINCT去重\ISNULL()求SUM()\NOT EXISTS的使用

进入正题,准备我们的测试数据 1.我们要筛选的数据为去除 GX 列的重复项 并将所有数据展示出来,如图所示: 1 select t.* from [PeopleCount] as t where t.procedureID='8334' 2.这种情况下我们是不可以使用DISTINCT来去重的,我们可以来尝试一下: 首先,单纯的查询 GX 这一列用 distinct 是没有任何问题的 1 select distinct t.GX from [PeopleCount] as t where t.pr

C# Distinct去重泛型List

List<int>去重 List<string>去重 List<T>去重 1. List<int>去重 List<int> ilist = new List<int>() { 1, 2, 3, 4, 2, 3 }; ilist = ilist.Distinct().ToList(); foreach (var item in ilist) { Console.WriteLine(item); } 2. List<string&g