C# EF去除重复列DistinctBy方式

目录
  • C# EF去除重复列DistinctBy
  • C#集合用Distinct去掉重复的元素,IEqualityComparer<T>原理
    • json测试数据
    • 实体类型
  • 总结

C# EF去除重复列DistinctBy

在网上看了LinQ有DistinctBy方法,实际在用的时候并没有找到,后来参照了该网站才发现写的是拓展方法

https://www.jb51.net/article/273355.htm

1.添加一个扩展方法

    public static class DistinctByClass
    {
        public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
        {
            HashSet<TKey> seenKeys = new HashSet<TKey>();
            foreach (TSource element in source)
            {
                if (seenKeys.Add(keySelector(element)))
                {
                    yield return element;
                }
            }
        }
    }

2.使用方法如下(针对ID,和Name进行Distinct)

var query = people.DistinctBy(p => new { p.Id, p.Name });

3.若仅仅针对ID进行distinct:

var query = people.DistinctBy(p => p.Id);

C#集合用Distinct去掉重复的元素,IEqualityComparer<T>原理

json测试数据

[
    {
        "Type": "ROLETYPE_USER",
        "Value": "9846cdac-ae21-4be4-a284-50158dd19606"
    },
    {
        "Type": "ROLETYPE_USER",
        "Value": "4f6665fc-b0b9-4865-bf12-eff06810efa3"
    },
    {
        "Type": "ROLETYPE_USER",
        "Value": "ca4dbf59-d248-4538-9fe8-62e1cafcde6c"
    },
    {
        "Type": "ROLETYPE_USER",
        "Value": "7c4852c2-b2c2-4688-92a3-3dd1b00bacf8"
    },
    {
        "Type": "ROLETYPE_USER",
        "Value": "982a2f9d-a079-4613-825f-c2ef9801eb3e"
    },
    {
        "Type": "ROLETYPE_USER",
        "Value": "ca4dbf59-d248-4538-9fe8-62e1cafcde6c"
    },
    {
        "Type": "ROLETYPE_USER",
        "Value": "ca4dbf59-d248-4538-9fe8-62e1cafcde6c"
    },
    {
        "Type": "ROLETYPE_ROLE",
        "Value": "76f62bf8-bf24-48c1-b70e-7628ff08c3fb"
    },
    {
        "Type": "ROLETYPE_USER",
        "Value": "982a2f9d-a079-4613-825f-c2ef9801eb3e"
    }
]

实体类型

    public class TempSetting
    {
       public string Type { get; set; }
        public Guid Value { get; set; }
    }

创建比较类,继承自IEqualityComparer<TSource>,一般要选择特征值字段来设置hashCode值返回才有效果,或者直接设置哈希值返回1(这样每次都会调用Equals方法,但这样性能低)。

IEqualityComparer比较对象是否相等是优先调用GetHashCode()比较哈希值是否相等,不相等的就不会调用Equals方法,如果哈希值相等的才会调用调用Equals方法再比较是否相等最终确认,所以 GetHashCode方法里面要设置特征值字段来返回hashcode,这样速度才快,性能高

 public class CompareSetting : IEqualityComparer<TempSetting>
    {
        public bool Equals(TempSetting x, TempSetting y)
        {
            return x.Value == y.Value;
        }
 
        public int GetHashCode(TempSetting obj)
        {
            if (obj == null)
            {
                return 0;
            }
            //return obj.GetHashCode();//比较不出来重复的
            //string km = obj.Type + obj.Value;//比较重复值成功
            //return km.GetHashCode();
            //GetHashCode推荐选择自己看中的特征值字段来进行比较,否则有时候可能比较不成功
            return obj.Value.GetHashCode();
        }
    }
 
//测试比较
        string funs = "[{\"Type\":\"ROLETYPE_USER\",\"Value\":\"9846cdac-ae21-4be4-a284-50158dd19606\"},{\"Type\":\"ROLETYPE_USER\",\"Value\":\"4f6665fc-b0b9-4865-bf12-eff06810efa3\"},{\"Type\":\"ROLETYPE_USER\",\"Value\":\"ca4dbf59-d248-4538-9fe8-62e1cafcde6c\"},{\"Type\":\"ROLETYPE_USER\",\"Value\":\"7c4852c2-b2c2-4688-92a3-3dd1b00bacf8\"},{\"Type\":\"ROLETYPE_USER\",\"Value\":\"982a2f9d-a079-4613-825f-c2ef9801eb3e\"},{\"Type\":\"ROLETYPE_USER\",\"Value\":\"ca4dbf59-d248-4538-9fe8-62e1cafcde6c\"},{\"Type\":\"ROLETYPE_USER\",\"Value\":\"ca4dbf59-d248-4538-9fe8-62e1cafcde6c\"},{\"Type\":\"ROLETYPE_ROLE\",\"Value\":\"76f62bf8-bf24-48c1-b70e-7628ff08c3fb\"},{\"Type\":\"ROLETYPE_USER\",\"Value\":\"982a2f9d-a079-4613-825f-c2ef9801eb3e\"}]";
            List<TempSetting> list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<TempSetting>>(funs);
            var list2 = list.Distinct(new CompareSetting());

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 全面分析c# LINQ

    大家好,这是 [C#.NET 拾遗补漏] 系列的第 08 篇文章,今天讲 C# 强大的 LINQ 查询.LINQ 是我最喜欢的 C# 语言特性之一. LINQ 是 Language INtegrated Query 单词的首字母缩写,翻译过来是语言集成查询.它为查询跨各种数据源和格式的数据提供了一致的模型,所以叫集成查询.由于这种查询并没有制造新的语言而只是在现有的语言基础上来实现,所以叫语言集成查询. 一些基础 在 C# 中,从功能上 LINQ 可分为两类:LINQ to Object 和 L

  • C#笔记之EF Code First 数据模型 数据迁移

    目录 一.EF的创建 二.修改数据库 一.加数据库字段 二.加数据库 表 EF的基本使用 一.EF的创建二.修改数据库一.加数据库字段二.加数据库 表 一.EF的创建 第一步: 创建一个类库 第二步: 选择类库 第三步:选择ADO.NET 实体数据模型,名称和你数据库名字对应,我的叫LetDB 第四步:出现了窗体 先解释一下这些EF模型: 1.来自数据库的EF设计器: 先有数据库,根据数据库生成模型 2.空EF设计模型: 模型优先,通过设计的模型生成数据库 3.空 Code First 模型:

  • C#中Linq的去重方式Distinct详解

    前天在做批量数据导入新增时,要对数据进行有效性判断,其中还要去除重复,如果没出现linq的话可能会新声明一个临时对象集合,然后遍历原始数据判断把符合条件的数据添加到临时集合中,这在有了linq之后显得比较麻烦. 一.首先创建一个控制台应用程序,添加一个Person对象 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;

  • C# EF去除重复列DistinctBy方式

    目录 C# EF去除重复列DistinctBy C#集合用Distinct去掉重复的元素,IEqualityComparer<T>原理 json测试数据 实体类型 总结 C# EF去除重复列DistinctBy 在网上看了LinQ有DistinctBy方法,实际在用的时候并没有找到,后来参照了该网站才发现写的是拓展方法 https://www.jb51.net/article/273355.htm 1.添加一个扩展方法     public static class DistinctByCla

  • pandas去除重复列的实现方法

    数据准备 假设我们目前有两个数据表: ① 一个数据表是关于三个人他们的id以及其他的几列属性信息 import pandas as pd import numpy as np data = pd.DataFrame(np.random.randint(low=1,high=20,size=(3,4))) data['id'] = range(1,4) # 输出:其中,最左边的0 1 2 为其索引 ② 另外一个数据表是3个用户的app操作日志信息,一个人会有多条app操作记录 sample = p

  • Android Gradle依赖管理、去除重复依赖、忽略的方式

    常用依赖 //1.直接依赖第三方开源库,一般是托管在 jitpack 或者 jcenter implementation 'com.google.code.gson:gson:2.2.4' implementation 'com.android.support:cardview-v7:25.0.0' implementation 'com.android.support:design:25.0.0' //2.直接依赖本地的aar文件,一般是在libs目录下 implementation(name

  • java中List去除重复数据的5种方式总结

    前言 List 是一个接口,它继承于Collection的接口.它代表着有序的队列.当我们讨论List的时候,一般都和Set作比较. List中元素可以重复,并且是有序的(这里的有序指的是按照放入的顺序进行存储.如按照顺序把1,2,3存入List,那么,从List中遍历出来的顺序也是1,2,3). Set中的元素不可以重复,并且是无序的(从set中遍历出来的数据和放入顺序没有关系). 以下介绍五种-不同的方法去除 Java 中ArrayList中的重复数据 1.使用LinkedHashSet删除

  • mysql实现合并结果集并去除重复值

    目录 mysql 合并结果集并去除重复值 mysql 合并结果集(union,union all) union 与 union all 执行结果不同 对UNION,UNION ALL的结果继续处理,需要加括号 mysql中,UNION,UNION ALL的性能/效率不同 总结 mysql 合并结果集并去除重复值 SELECT DISTINCT c.parent_id from (     SELECT parent_id  FROM tp_goods_category a join tp_goo

  • 字符串聚合函数(去除重复值)

    --功能:提供字符串的替代聚合函数 --说明:例如,将下列数据 --test_id test_value -------------------- 'a' '01,03,04' 'a' '02,04' 'b' '03,04,08' 'b' '06,08,09' 'c' '09' 'c' '10' --转换成test_vlaue列聚合后的函数,且聚合后的字符串中的值不重复 --test_id test_value -------------------- 'a' '01,03,04,02' 'b'

  • Java实现数组去除重复数据的方法详解

    本文实例讲述了Java实现数组去除重复数据的方法.分享给大家供大家参考,具体如下: 前一段时间被面试问到:如果一个数组中有重复元素,用什么方法可以去重?一时间会想到用一种方法,但是后来查阅资料后发现,有好多方法可以实现,现在就总结一下,比较简单的几种. 一.用List集合实现 int[] str = {5, 6, 6, 6, 8, 8, 7,4}; List<Integer> list = new ArrayList<Integer>(); for (int i=0; i<s

  • awk实现Left、join查询、去除重复值以及局部变量讲解例子

    最近看到论坛里面有几个不错的小例子,对于学习awk还是有帮助,在这儿详细的说一下 一.类似数据库中的left join查询 复制代码 代码如下: [root@krlcgcms01 mytest]# cat a.txt    //a.txt 111   aaa 222   bbb 333   cccc 444   ddd [root@krlcgcms01 mytest]# cat b.txt    //b.txt 111  123  456 2    abc  cbd 444  rts  786

  • MySQL 去除重复数据实例详解

    MySQL 去除重复数据实例详解 有两个意义上的重复记录,一是完全重复的记录,也即所有字段均都重复,二是部分字段重复的记录.对于第一种重复,比较容易解决,只需在查询语句中使用distinct关键字去重,几乎所有数据库系统都支持distinct操作.发生这种重复的原因主要是表设计不周,通过给表增加主键或唯一索引列即可避免. select distinct * from t; 对于第二类重复问题,通常要求查询出重复记录中的任一条记录.假设表t有id,name,address三个字段,id是主键,有重

  • jquery实现去除重复字符串的方法小结

    本文实例总结了jquery实现去除重复字符串的方法.分享给大家供大家参考,具体如下: 这里总结了三种去除重复字符串的方法: 把例子贴上,用jQuery方便些,首先要搭好环境,就是在同一目录下(同一文件夹下)保证有所使用的jquery1.8.1(如果是其他版本就在html代码中作相应改动) 第一: <html> <head> <script src="jquery-1.8.1.js"></script> <SCRIPT LANGUAG

随机推荐