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 */