我需要在Dictionary,List等中使我的自定义对象正常工作...这样我就可以更改对象的属性,并允许它被使用,而不是孤立的。
我最后一次尝试覆盖GetHashCode(),当我将对象添加到字典时,我的孤立对象对对象进行了更改(更改了GetHashCode),这导致Dictionary无法正确处理内存中的对象。
问题
有人可以解释一下:
我需要在TrustedEntityReference中覆盖哪些接口和接口才能在排序字典中正确连接int
和TrustedEntity
?
对于.NET字典对象中使用的内容,哪些值必须永远不会改变,否则会冒成孤立对象的风险? (例如,更改对象的发出哈希码可能会导致GC出现字典问题)
这是我正在处理的当前示例对象。
namespace Model
{
public class TrustedEntity
{
public TrustedEntity()
{
this.BackTrustLink = new List<TrustedEntityReference>();
this.ForwardTrustLink = new List<TrustedEntityReference>();
}
public List<TrustedEntityReference> BackTrustLink { get; set; }
public string EntryName { get; set; }
public List<TrustedEntityReference> ForwardTrustLink { get; set; }
}
// This is the object I want to be treated as a "key" in the above List<T>
// I want a duplicate object exception to occur if a duplicate TrustedEntityReference is inserted into trustedEntity.BackTrustLink or trustedEntity.ForwardTrustLink
public class TrustedEntityReference
{
public int HierarchyDepth { get; set; }
public TrustedEntity TrustedEntity {get; set; }
}
}
答案 0 :(得分:0)
TKey无法更改(否则您将无法在字典中找到条目,因为您将查找错误的密钥)。
修改强>:
看起来我错过了TKey类型。
Dictionary需要一个相等的实现来确定键是否相等。您可以使用接受comparer参数的构造函数指定IEqualityComparer泛型接口的实现。如果未指定实现,则使用默认的通用相等比较器EqualityComparer.Default。如果类型TKey实现System.IEquatable泛型接口,则默认的相等比较器使用该实现。
我希望这意味着TrustedEntityReference应该实现IEqualityComparer接口(尽管我会同时实现ICompariable)。 您还可以使用Dictionary(IEqualityComparer)构造函数指定自己的。
这些接口中的方法必须始终返回相同的值,即使对象的值已更改。
http://msdn.microsoft.com/en-us/library/ms132072.aspx
如果您需要更多信息,请与我们联系。
答案 1 :(得分:0)
所以主要的事情是覆盖GetHashCode和Equals(不包括排序的东西)。您要确定的下一件事是,一旦从GetHashCode返回一个值,即使该对象的生命周期也需要返回相同的值,即使它的生成值被修改。
对于排序,您只需要IComparable作为默认比较器,或者您可以为它提供自己的Comparer实例。
答案 2 :(得分:0)
你实际上根本不需要做任何特别的事情,前提是重复的数据不是问题(因为它没有发生,其他的是强制执行它,或者因为你想要它在那里多次)。
具体来说,根据this answer,您可以使用任何对象,它只会检查引用相等性。这个对象是同一个对象吗?具有相同数据的不同对象将不同,但即使您更改了数据,同一对象也将是相同的。
因此,对于您的示例,如果您使用相同的初始数据填充List<TrustedEntityReference>
,则不会出现问题。如果他们各自加载他们自己的数据集,这将无济于事。