我们可能经常用的是Distinct<TSource>(IEnumerable<TSource>) 用它对数组这一类去重复 这里要用Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer <TSource>) 使用指定的 IEqualityComparer<T> 对值进行比较 一、先为数据做个实体类:User public class User { public User(int } public int Id { get; set; } public string Name { get; set; } } 二、再自定义一个User比较类(实现IEqualityComparer <T>接口):UserComparer public class UserComparer : IEqualityComparer<User> { #region IEqualityComparer public int GetHashCode(User obj) { return 0; } #endregion } 自定义一个比较类,去继承IEqualityComparer
可以看到字典等的构造函数都有重载方法,要求传入 IEqualityComparer 接口,于是可以做如下实现 class ReferenceEqualsComparer<T> : ReferenceEqualsComparer , IEqualityComparer<T> { /// <inheritdoc /> public bool Equals(T x, T y) => ((IEqualityComparer public int GetHashCode(T obj) => obj.GetHashCode(); } class ReferenceEqualsComparer : IEqualityComparer { /// <inheritdoc /> bool IEqualityComparer.Equals(object x, object y) => ReferenceEquals
虽然可以包装成实现IEqualityComparer<ImmutableList<T>>的类型,但我目前尚未这样做。遗憾的是,C#记录类型的工作方式无法为特定属性指定相等比较器。 因此,当创建ImmutableDictionary<Constituency, Result>时,我希望提供仅执行引用比较的IEqualityComparer<Constituency>。 更新:感谢Michael Damatov指出,框架中确实存在System.Collections.Generic.ReferenceEqualityComparer——但它实现的是非泛型的IEqualityComparer 我愚蠢地忽略了IEqualityComparer<T>的逆变特性:存在从IEqualityComparer<object>到任何类类型X的IEqualityComparer<X>的隐式引用转换。 功能需求总结总结来说,虽然我喜欢记录类型和不可变集合,但可以通过引入以下内容减少摩擦:控制生成代码中每个属性使用的相等比较器的方式不可变集合的相等比较器,能指定元素比较方式执行引用比较的IEqualityComparer
public static IEnumerable<T> Distinct<T, V>(this IEnumerable<T> source, Func<T, V> keySelector, IEqualityComparer using System.Runtime.CompilerServices; using System.Linq; public class CommonEqualityComparer<T, V> : IEqualityComparer <T> { private Func<T, V> keySelector; private IEqualityComparer<V> comparer; public CommonEqualityComparer (Func<T, V> keySelector, IEqualityComparer<V> comparer) { this.keySelector = keySelector;
outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, TInner, TResult> resultSelector, IEqualityComparer 使用指定的IEqualityComparer<TKey> 对键进行比较。 以上与Join第一种方法无非就是多一个IEqualityComparer<TKey>,如果使用一个继承于IEqualityComparer<TKey>的类初始化comparer,它就会使用该类对对TOuter.TKey outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, IEnumerable<TInner>, TResult> resultSelector, IEqualityComparer 使用指定的IEqualityComparer<TKey>对键进行比较。 这个与Join第二种方法类似,这里不再进行讲述。
IEqualityComparer实现 下面我们创建一个学生类,从而进一步的实现我们对象数据的对比 public class Student { public string Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>) 通过使用指定的 IEqualityComparer<T> 对值进行比较 comparer IEqualityComparer<TSource> 用于比较值的 IEqualityComparer<T>。
.ToString()); }); Console.WriteLine(); 先用Linq的Distinct方法实现,因为每行有好多列,要实现IEqualityComparer <T>接口 public class DataTableRowCompare : IEqualityComparer<DataRow> { #region IEqualityComparer }); Console.ReadLine(); } } public class DataTableRowCompare : IEqualityComparer <DataRow> { #region IEqualityComparer<DataRow> 成员 public bool Equals(DataRow x,
, TResult> resultSelector, IEqualityComparer<TKey>? , TInner, TResult> resultSelector, IEqualityComparer<TKey>? , TResult>> resultSelector, IEqualityComparer<TKey>? , TInner, TResult>> resultSelector, IEqualityComparer<TKey>?
IEqualityComparer实现 下面我们创建一个学生类,从而进一步的实现我们对象数据的对比 public class Student { public string Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>) 通过使用指定的 IEqualityComparer<T> 对值进行比较 comparer IEqualityComparer<TSource> 用于比较值的 IEqualityComparer<T>。
针对对象中的某个字段只能用Distinct(IEqualityComparer<T>) using System; using System.Collections.Generic; using System.Linq class StrItem { public int id; public int num; } public class Comparint : IEqualityComparer
dictionary):base(dictionary) { } public SerializableDictionary(IEqualityComparer capacity):base(capacity) { } public SerializableDictionary(int capacity, IEqualityComparer
dictionary; } } return (IDictionary<string, object>) new Dictionary<string, object>((IEqualityComparer new Dictionary<string, object>(dictionary, (IEqualityComparer<string>) StringComparer.OrdinalIgnoreCase ) : new Dictionary<string, object>((IEqualityComparer<string>) StringComparer.OrdinalIgnoreCase); _data.Keys, (IEqualityComparer<string>) StringComparer.OrdinalIgnoreCase); this.
自定义比较器的基本概念在C#中,自定义比较器通常通过实现IComparer<T>或IEqualityComparer<T>接口来实现。 IEqualityComparer<T>接口IEqualityComparer<T>接口用于定义对象的相等性比较逻辑,它包含两个方法:Equals和GetHashCode。
} } 述扩展方法即可去重,如下: var list2 = list.Distinct(d => new { d.Age, d.Name }).ToList(); 第三种 IEqualityComparer source.Distinct(new DynamicEqualityComparer<T>(comparer)); private sealed class DynamicEqualityComparer<T> : IEqualityComparer
var a = vs.Contains(2);//true 它还有一个重载方法 Contains(T t,IEqualityComparer<T> e),第二个参数用于自定义比较的规则,因为有的时候系统的直接比较法不是我们想要的 所以就需要我们自定义比较规则,这个可以展开来解释一下:它的第二个参数是一个接口,接口里边定义了一个Equals()方法,我们需要自定义一个类实现这个接口,请看代码: public class MyClass : IEqualityComparer var a = vs.OrderBy(c => c);//运行结果 12356 下面我使用它的重载降序排序数据 public class MyClass : IEqualityComparer<int
//传入相等性比较器的 public static bool Contains<TSource> (this IEnumerable<TSource> source, TSource value, IEqualityComparer public class StudentEqualityCompare: IEqualityComparer<Student> { public bool Equals(Student x, Student IEnumerable<TSource> Union<TSource> (this IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer comparerIEqualityComparer 用于对键进行哈希处理和比较的 IEqualityComparer。 </touter,ienumerable comparer IEqualityComparer 用于对键进行哈希处理和比较的 IEqualityComparer。
TSource>> GroupBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer "Female", } }; 其次,增加一个相等比较器类,用于对Person进行分组: class PersonEqualityComparer : IEqualityComparer public int GetHashCode(Person obj) => obj.Name.GetHashCode(); } 其中定义了如何对一个Person相等性定义,只要实现IEqualityComparer source, Func<TSource, TKey> keySelector, Func<TKey, IEnumerable<TSource>, TResult> resultSelector, IEqualityComparer Func<TSource, TElement> elementSelector, Func<TKey, IEnumerable<TElement>, TResult> resultSelector, IEqualityComparer
该方法使用IEqualityComparer<T>默认比较器来确定元素是否相等。对于值类型,这通常是基于值的比较;而对于引用类型,则是基于引用的比较。 例如,对于大型对象,可以根据对象的特定属性来实现IEqualityComparer<T>接口。延迟执行:LINQ查询是延迟执行的,这意味着实际的去重操作会在遍历结果序列时才执行。
线程锁 internal volatile int[] m_countPerLock; //索格锁所管理的数据数量 internal readonly IEqualityComparer //构造函数 internal Tables(Node[] buckets, object[] locks, int[] countPerlock, IEqualityComparer > internal ConcurrentDictionaryMini(int concurrencyLevel, int capacity, bool growLockArray, IEqualityComparer Tables tables = m_tables; IEqualityComparer<TKey> comparer = tables.m_comparer; { while (true) { Tables tables = m_tables; IEqualityComparer
TSource> ToLookup<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer