C# EF去除重复列DistinctBy方式

 更新时间:2023年01月24日 13:37:50   作者:---清心寡欲---  
这篇文章主要介绍了C# EF去除重复列DistinctBy方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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());

总结

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

相关文章

  • C#中委托(Delegates)的使用方法详解

    C#中委托(Delegates)的使用方法详解

    这篇文章主要为大家详细介绍了C#中委托(Delegates)的使用方法,感兴趣的朋友可以参考一下
    2016-06-06
  • C#初始化数组的方法小结

    C#初始化数组的方法小结

    这篇文章主要介绍了C#初始化数组的方法,总结分析了C#声明与初始化一维数组及多维数组的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • 关于C#连接SQL Server时提示用户登录失败的解决方法

    关于C#连接SQL Server时提示用户登录失败的解决方法

    在用C#开发windows端程序并连接SQL Server时有可能会遇到数据库登录失败的问题,下面小编给大家带来了C#连接SQL Server时提示用户登录失败的解决方法,感兴趣的朋友一起看看吧
    2021-11-11
  • C#处理JPEG头信息的方法

    C#处理JPEG头信息的方法

    相信大家肯定都看过用C或C++处理JPEG头信息的程序了,我也看了,不过因为我不懂C,看得我头疼。所以我还是决定用C#来写吧
    2013-05-05
  • c#中LINQ的基本用法实例

    c#中LINQ的基本用法实例

    语言集成查询 (LINQ) 是 Visual Studio 2008 和 .NET Framework 3.5 版中引入的一项创新功能。下面这篇文章主要给大家介绍了关于c#中LINQ的基本用法,需要的朋友可以参考借鉴,下面来一起看看吧
    2019-01-01
  • C#编程中使用ref和out关键字来传递数组对象的用法

    C#编程中使用ref和out关键字来传递数组对象的用法

    这篇文章主要介绍了C#编程中使用ref和out关键字来传递数组对象的用法,在C#中数组也是对象可以被传递,需要的朋友可以参考下
    2016-01-01
  • C#中数组、ArrayList和List三者的区别详解及实例

    C#中数组、ArrayList和List三者的区别详解及实例

    这篇文章主要介绍了C#中数组、ArrayList和List三者的区别详解及实例的相关资料,需要的朋友可以参考下
    2016-12-12
  • 对int array进行排序的实例讲解

    对int array进行排序的实例讲解

    下面小编就为大家分享一篇对int array进行排序的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • C#实现获取文件大小并进行比较

    C#实现获取文件大小并进行比较

    这篇文章主要为大家详细介绍了C#如何实现获取文件大小进行单位转换与文件大小比较功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-03-03
  • vs2019安装和使用详细图文教程

    vs2019安装和使用详细图文教程

    这篇文章主要介绍了vs2019安装和使用详细图文教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03

最新评论