Tag: iequalitycomparer

字典使用是自定义键,但键始终不相等

我在字典中使用RTBTextPointer作为自定义键… Init.SpintaxEditorPropertyMain.SpintaxListDict = new Dictionary(new RTBTextPointerComparer()); 我在类库中编写RTBTextPointer和RTBTextPointerComparer类,并在不同的wpf项目中使用它, if (Init.SpintaxEditorPropertyMain.SpintaxListDict.ContainsKey(_index) == false) { Init.SpintaxEditorPropertyMain.SpintaxListDict.Add(_index,_SpintaxMappedVal); } everytime containsKey返回false,即使它包含,所以在字典中出现重复条目​​..我的“GetHashCode()”中有任何错误 public class RTBTextPointer { static int _row; static int _column; public int Row { get { return _row; } set { _row = value; } } public int Column { get { return _column; } set { _column = […]

如何从重新实现GetHashCode的类中获取原始哈希代码?

简短问题:如何获取已重新实现GetHashCode()的对象的object.GetHashCode()值? 长话:所以我有大约十万个对象,每个对象共享许多(非编译时)常见字符串。 常见,如果值相等,则它是相同的实例。 知道这一点,我想我宁愿使用标准对象比较( ReferenceEquals )而不是完整的字符串比较 – 特别是因为这些是在相当规律的基础上在字典中查找的。 所以我声明了一个class ReferenceEqualityComparer : IEqualityComparer与Dictionary ,认为无论如何都要有用,并且尝试实现这两种方法。 等于很容易,使用object.ReferenceEquals 。 但是如何获得GetHashCode方法的object.GetHashCode()等价物呢? 即如何获得对象实例的一些表示? 我知道还有其他方法可以做到这一点 – 创建一个InternedString类,它保存对string的引用,但不实现Equals或GetHashCode ,或者存储索引而不是每个对象的字符串,但我现在很好奇 -实际上有一种实现通用ReferenceEqualityComparer吗?

比较两个Dictionary 的最佳方法是否相等

这是为两个字典的平等创建比较器的最佳方法吗? 这需要准确。 请注意,Entity.Columns是KeyValuePair的字典(字符串,对象): public class EntityColumnCompare : IEqualityComparer { public bool Equals(Entity a, Entity b) { var aCol = a.Columns.OrderBy(KeyValuePair => KeyValuePair.Key); var bCol = b.Columns.OrderBy(KeyValuePAir => KeyValuePAir.Key); if (aCol.SequenceEqual(bCol)) return true; else return false; } public int GetHashCode(Entity obj) { return obj.Columns.GetHashCode(); } } 关于GetHashCode实现也不太确定。 谢谢!

利用IEqualityComparer 的GetHashCode()部分进行直接比较?

我编写了一个派生自IEqualityComparer ,它非常适合我需要它的LINQ查询。 据我了解,首先调用GetHashCode() (fast),然后调用Equals() (稍慢),如果hashcode相同,则进行此类操作。 然而,当使用它进行直接比较时,手动,我正在使用类似的东西 return new MyIEqualityComparer().Equals(objA,objB); 放弃了更快的GetHashCode()相等性检查。 有没有办法比较objA到objB哪个不会自动跳过更快的GetHashCode()检查? 我想我希望objA.Equals()有一个重载接受从IEqualityComparer派生的参数。

实现IEqualityComparer 以比较任何类的任意属性(包括匿名)

我正在编写实现IEqualityComparer的这个整洁的类,因此我可以将任何匿名类型传递给它(或实际上任何具有属性的类型),它将通过比较类型的属性值自动比较类型。 public class CompareProperty : IEqualityComparer { private Type type; private PropertyInfo propInfo; private string _fieldName; public string fieldName { get; set; } public CompareProperty(string fieldName) { this.fieldName = fieldName; } public bool Equals(T x, T y) { if (this.type == null) { type = x.GetType(); propInfo = type.GetProperty(fieldName); } object objX = propInfo.GetValue(x, null); […]

使用IEqualityComparer和Equals / GethashCode Override有什么区别?

当我使用字典有时我必须更改默认的等于意思,以便比较键。 我看到如果我覆盖键的类上的Equals和GetHashCode,或者我创建了一个实现IEqualityComparer的新类,我有相同的结果。 那么使用IEqualityComparer和Equals / GethashCode Override有什么区别? 两个例子: class Customer { public string name; public int age; public Customer(string n, int a) { this.age = a; this.name = n; } public override bool Equals(object obj) { Customer c = (Customer)obj; return this.name == c.name && this.age == c.age; } public override int GetHashCode() { return (this.name […]

EqualityComparer 。默认与T.Equals

假设我有一个通用的MyClass需要比较两个类型的对象。 通常我会做…… void DoSomething(T o1, T o2) { if(o1.Equals(o2)) { … } } 现在假设我的MyClass有一个支持传递自定义IEqualityComparer的构造函数,类似于Dictionary 。 在那种情况下,我需要做…… private IEqualityComparer _comparer; public MyClass() {} public MyClass(IEqualityComparer comparer) { _comparer = comparer; } void DoSomething(T o1, T o2) { if((_comparer != null && _comparer.Equals(o1, o2)) || (o1.Equals(o2))) { … } } 要删除这个冗长的if语句,如果使用常规构造函数,我可以将_comparer默认为’default _comparer ‘。 我搜索了类似typeof(T).GetDefaultComparer()但却无法找到类似的东西。 我确实找到了EqualityComparer.Default ,我可以使用吗? 然后这个片段…… […]

.net中的对象比较

是否与CLR的观点有任何不同,实现IEqualityComparer与覆盖在IEqualityComparer使用的属性的==运算符? 如果是这样,你什么时候用另一个? 编辑 好吧,Hashtable的实现所使用的IEqaulityComparer确实有意义 – 当我发布问题时,它已经脱离了我的脑海。 那么IEnumerable的Linq的扩展呢? 这是否意味着.net在执行这些扩展方法时会构建一个Hashtable?

检查与对象的HashSet的相等性

我试图比较Definition类型的两个哈希集作为EqualityComparer.Default.Equals(value, oldValue) 。 Definition定义如下 public class Definition { public string Variable { get; set; } public HashSet LocationList { get; set; } public override bool Equals(object obj) { Definition other = obj as Definition; return other.Variable.Equals(this.Variable) && other.LocationList!= null &&this.LocationList != null && other.LocationList.Count == this.LocationList.Count && other.LocationList == this.LocationList; } public override int GetHashCode() […]

LINQ Group通过多个ref-type字段; 自定义EqualityComparer

所以我在SO和其他地方看了大约20个例子,但没有找到一个涵盖我正在尝试做的事情。 这个 – 我可以指定我的显式类型比较器内联吗? – 看起来像我需要的东西,但不够远(或者我不明白如何进一步采取它)。 我有一个LoadData列表,LoadData对象包含引用和值类型的字段 需要对ref和value字段的混合进行分组,将输出投影为匿名类型 需要(我认为)提供自定义IEqualityComparer来指定如何比较GroupBy字段,但它们是匿名类型 private class LoadData { public PeriodEndDto PeriodEnd { get; set; } public ComponentDto Component { get; set; } public string GroupCode { get; set; } public string PortfolioCode { get; set; } } 我到目前为止最好的GroupBy查询: var distinctLoads = list.GroupBy( dl => new { PeriodEnd = dl.PeriodEnd, Component […]