C# List集合根据对象属性判断去重复

时间:2022-05-06 05:21:57
List<Data> list= new List<Data>();
list.Add(new Data{ lat=37,lon = 105,value = 80 });
list.Add(new Data{ lat= 37,lon = 105,value = 90 });
list.Add(new Data{ lat= 38,lon = 107,value = 70 });
list.Add(new Data{ lat= 37,lon = 105,value = 80 });
list.Add(new Data{ lat= 34,lon = 106,value = 85 });
list.Add(new Data{ lat= 34,lon = 106,value = 70 });
list.Add(new Data{ lat= 38,lon = 109,value = 80 });
 . . . . . . 
 
如果lat和lon都相同,则取value大的;新的List中,lat、lon相同的只能有一组数

5 个解决方案

#1


            var r = list.OrderByDescending(x=>x.value).Distinct(x => new { x.lat, x.lon });
            foreach (var x in r) Console.WriteLine(x);
C# List集合根据对象属性判断去重复

#2


list.GroupBy(x => new {x.lat, x.lon}).Select(x => x.OrderBy(y => y.value).Last())

#3


引用
list.GroupBy(x => new {x.lat, x.lon}).Select(x => x.OrderBy(y => y.value).Last())


为什么我这样写还是有重复的,实际业务有一百多万条的数据,和数据量大小有关系吗?

#4


用Dictionary,Key就是你的Data,Value也是Data,但同时要传入Icompare接口的实现,然后每次add时,判断下是否有lat和lot对应的Data存在,如果存在,则判断后确认是否需要赋值

#5


list.GroupBy(x => x.lat.ToString() + "|" + x.lon.ToString()).Select(x => x.OrderBy(y => y.Z).Last()).ToList();
先将要比较的两个属性转化成字符串,在拼接起来进行分组、排序,就可以取到最大的。

#1


            var r = list.OrderByDescending(x=>x.value).Distinct(x => new { x.lat, x.lon });
            foreach (var x in r) Console.WriteLine(x);
C# List集合根据对象属性判断去重复

#2


list.GroupBy(x => new {x.lat, x.lon}).Select(x => x.OrderBy(y => y.value).Last())

#3


引用
list.GroupBy(x => new {x.lat, x.lon}).Select(x => x.OrderBy(y => y.value).Last())


为什么我这样写还是有重复的,实际业务有一百多万条的数据,和数据量大小有关系吗?

#4


用Dictionary,Key就是你的Data,Value也是Data,但同时要传入Icompare接口的实现,然后每次add时,判断下是否有lat和lot对应的Data存在,如果存在,则判断后确认是否需要赋值

#5


list.GroupBy(x => x.lat.ToString() + "|" + x.lon.ToString()).Select(x => x.OrderBy(y => y.Z).Last()).ToList();
先将要比较的两个属性转化成字符串,在拼接起来进行分组、排序,就可以取到最大的。