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>
返回原数据中不重复的序列
当给的参数为空时抛出的异常:
备注:
该方法通过使用延迟执行来实现。 立即返回值是存储执行操作所需的所有信息的对象。 通过直接调用其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 */