EF之通过不同条件查找去重复 Enumerable.Distinct Method(IEnumerable, IEqualityComparer)

也就是使用的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
*/