在C#中,去重函數可以通過多種方式實現,每種方式都有其優缺點和擴展性。以下是一些常見的去重方法:
public static IEnumerable<T> Distinct<T>(this IEnumerable<T> source)
{
return source.DistinctBy(x => x);
}
public static IEnumerable<T> DistinctBy<T, TKey>(this IEnumerable<T> source, Func<T, TKey> selector)
{
HashSet<TKey> seen = new HashSet<TKey>();
foreach (var item in source)
{
var key = selector(item);
if (!seen.Add(key))
{
continue;
}
yield return item;
}
}
這種方法的時間復雜度為O(n),其中n為集合中的元素數量。它適用于去重簡單的屬性,但擴展性有限,因為它依賴于屬性的相等性比較。
public static IEnumerable<T> Distinct<T>(this IEnumerable<T> source)
{
return source.GroupBy(x => x).Select(g => g.First());
}
這種方法的時間復雜度也為O(n),但它使用了LINQ表達式,使得代碼更易讀。然而,它同樣依賴于屬性的相等性比較,并且對于復雜的對象比較可能會出現問題。
public static IEnumerable<T> Distinct<T>(this IEnumerable<T> source, IEqualityComparer<T> comparer)
{
return source.Distinct(Comparer);
}
這種方法允許你提供自定義的相等性比較器,從而提高了擴展性。但是,它的時間復雜度仍然為O(n),并且需要顯式傳遞比較器。
public static IEnumerable<T> Distinct<T>(this IEnumerable<T> source)
{
return source.GroupBy(x => (x, 0)).Select(g => g.Item1);
}
這種方法使用ValueTuple來存儲元素及其索引,從而避免了比較屬性的問題。然而,它的時間復雜度仍然為O(n),并且需要顯式創建ValueTuple。
總的來說,C#中去重函數的擴展性取決于你所使用的具體實現。如果你需要處理復雜的對象比較或者需要自定義的相等性比較器,那么使用IEqualityComparer