北京专业做网站怎么样,app软件开发摄像头,旗县政务网站建设工作方案,做网站推销产品效果怎么样代码进行简单的分析#xff1a;
DistinctBy 方法#xff1a;
这个方法是一个泛型方法#xff0c;参数包括 source#xff08;要去重的源集合#xff09;和 keySelector#xff08;用于选择去重的键的委托#xff09;。在方法内部#xff0c;创建了一个 HashSet 对象 …代码进行简单的分析
DistinctBy 方法
这个方法是一个泛型方法参数包括 source要去重的源集合和 keySelector用于选择去重的键的委托。在方法内部创建了一个 HashSet 对象 seenKeys用于存储已经出现过的键。遍历源集合中的每个元素通过 keySelector 获取元素的键并尝试将键加入到 seenKeys 中。如果成功加入即之前没有出现过则返回当前元素实现去重的效果。
Distinct 方法
这个方法也是一个泛型方法参数包括 source要去重的源集合和 comparer用于比较元素是否相等的委托。在方法内部调用了另一个重载的 Distinct 方法并传入一个实现了 IEqualityComparerT 接口的对象 DynamicEqualityComparerT。DynamicEqualityComparerT 类实现了 IEqualityComparerT 接口根据传入的比较委托来判断两个元素是否相等。在 Equals 方法中通过调用传入的比较委托来判断两个元素是否相等。在 GetHashCode 方法中简单地返回了固定的哈希码 0因为在这里并不需要真正的哈希码。
/// summary /// list list.Distinct(d new { d.Age, d.Name }).ToList();/// /summary /// typeparam nameTSource/typeparam /// typeparam nameTKey/typeparam /// param namesource/param /// param namekeySelectorp new { p.ID, p.Name }/param /// returns/returns public static IEnumerableTSource DistinctByTSource, TKey(this IEnumerableTSource source, FuncTSource, TKey keySelector){HashSetTKey seenKeys new HashSetTKey();foreach (TSource element in source){if (seenKeys.Add(keySelector(element))){yield return element;}}}/// summary/// 数据较大时使用此方法 list list.Distinct((a, b) a.Age b.Age a.Name b.Name).ToList();/// /summary/// typeparam nameT/typeparam/// param namesource/param/// param namecomparer/param/// returns/returnspublic static IEnumerableT DistinctT(this IEnumerableT source, FuncT, T, bool comparer)where T : class source.Distinct(new DynamicEqualityComparerT(comparer));private sealed class DynamicEqualityComparerT : IEqualityComparerTwhere T : class{private readonly FuncT, T, bool _func;public DynamicEqualityComparer(FuncT, T, bool func){_func func;}public bool Equals(T x, T y) _func(x, y);public int GetHashCode(T obj) 0;}