zoukankan      html  css  js  c++  java
  • EF之通过不同条件查找去重复

    Enumerable.Distinct<TSource> Method(IEnumerable<TSource>, IEqualityComparer<TSource>)

    也就是使用的Distinct(参数1,参数2);

    参数1为原数据,参数2为比较数据

    通过IEqualityComparer<T> 来比较值从而返回不同的序列。

    引用的名称空间:System.Linq

    程序集:System.Core (在 System.Core.dll下)

    语法:

    public static IEnumerable<TSource> Distinct<TSource>(
        this IEnumerable<TSource> source,
        IEqualityComparer<TSource> comparer
    )

    参数:

    原数据:

    类型:System.Collections.Generic.IEnumerable<TSource>
    指的是从中删除重复元素的序列

    比较数据:

    类型 : System.Collections.Generic.IEqualityComparer<TSource>
    这个是与原数据的比较值

    返回数据:

    类型: System.Collections.Generic.IEnumerable<TSource>
    返回原数据中不重复的序列

    当给的参数为空时抛出的异常:

    ArgumentNullException

    备注:

    该方法通过使用延迟执行来实现。 立即返回值是存储执行操作所需的所有信息的对象。 通过直接调用其GetEnumerator方法或在Visual C#或Visual Basic中使用foreach进行枚举,直到对象被枚举为止,才执行此方法所表示的查询。
    不同的<TSource>(IEnumerable <TSource>,IEqualityComparer <TSource>)方法返回一个无序的序列,不包含重复的值。 如果comparer为null,则使用默认的等式比较器Default来比较值。

    示例:

    以下示例显示如何实现可在Distinct <TSource>方法中使用的等式比较器。

    public class Product
    {
        public string Name { get; set; }
        public int Code { get; set; }
    }
    
    // 产品类的自定义比较器
    class ProductComparer : IEqualityComparer<Product>
    {
        // 如果产品的名称和产品编号相同,则产品相同
        public bool Equals(Product x, Product y)
        {
    
            //检查比较对象是否引用相同的数据
            if (Object.ReferenceEquals(x, y)) return true;
    
            //检查所比较的对象是否为空
            if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
                return false;
    
            //检查产品的属性是否相等
            return x.Code == y.Code && x.Name == y.Name;
        }
    
        // 如果Equals()对一对对象返回true
        // 那么GetHashCode()必须为这些对象返回相同的值。那么GetHashCode()必须为这些对象返回相同的值。
    
        public int GetHashCode(Product product)
        {
            //检查该对象是否为空
            if (Object.ReferenceEquals(product, null)) return 0;
    
            //如果它不为空,获取名称字段的
    hashCode
     int hashProductName = product.Name == null ? 0 : product.Name.GetHashCode(); //获取代码字段的hashCode int hashProductCode = product.Code.GetHashCode(); //计算产品的hashCode return hashProductName ^ hashProductCode; } }

    实现此比较器后,可以使用Distinct <TSource>方法中的一系列Product对象,如以下示例所示。

    Product[] products = { new Product { Name = "apple", Code = 9 }, 
                           new Product { Name = "orange", Code = 4 }, 
                           new Product { Name = "apple", Code = 9 }, 
                           new Product { Name = "lemon", Code = 12 } };
    
    //排除重复
    
    IEnumerable<Product> noduplicates =
        products.Distinct(new ProductComparer());
    
    foreach (var product in noduplicates)
        Console.WriteLine(product.Name + " " + product.Code);
    
    /*
        返回的值如下:
        apple 9 
        orange 4
        lemon 12
    */
  • 相关阅读:
    Python中append和extend的区别
    python学习 day19
    python学习 day18
    QT下编写使用for循环动态添加刻选择时间类型的按钮(记录一下)
    QT mingw编译器下使用snap7库与西门子200smart-PLC(网口)通信实现代码
    看着挺胖的大胖猫
    QT添加软键盘后,QDialog设置模态后软键盘没响应解决办法
    QT程序打包在别的电脑上运行提示“api-ms-win-crt-runtime-|1-1-0.dll"可能与您正在运行的Window版本不兼容。。。。。
    Qt使用WM_COPYDATA消息进行进程通信
    离线百度地图,QT添加按钮点击切换卫星地图和街道地图
  • 原文地址:https://www.cnblogs.com/LessIsMoreZ/p/7026091.html
Copyright © 2011-2022 走看看