-1

我需要使我的自定义对象在字典、列表等中正常工作......这样我就可以更改对象的属性,并允许它被使用,而不是孤立。

上次我尝试覆盖 GetHashCode() 时,当我将对象添加到字典时,我孤立了对象,对对象进行了更改(更改了 GetHashCode),这以某种方式导致字典无法正确地从内存中处理对象。

问题

有人可以解释一下:

  • 我需要在 TrustedEntityReference 中覆盖哪些接口和接口才能连接intTrustedEntity在排序字典中正常工作?

  • 对于 .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; }


    }
}
4

3 回答 3

0

你实际上根本不需要做任何特别的事情,只要重复数据不是问题(或者因为它没有发生,其他东西正在强制它,或者因为你希望它在那里多次)。

具体来说,根据这个答案,您可以使用任何对象,它只检查引用相等性。这个对象是同一个对象吗?具有相同数据的不同对象会有所不同,但相同的对象,即使您更改了数据,也将是相同的。

因此,对于您的示例,如果您List<TrustedEntityReference>从相同的初始数据填充您的 's,您将不会遇到问题。如果他们每个人都加载自己的数据集,这将无济于事。

于 2012-10-16T17:41:16.960 回答
0

使用ListDictionary不需要接口

TKey 不能更改(否则您将无法在 Dictionary 中找到条目,因为您将寻找错误的键)。

编辑
看起来我错过了 TKey 类型。

字典需要一个相等的实现来确定键是否相等。您可以使用接受比较器参数的构造函数来指定 IEqualityComparer 通用接口的实现;如果未指定实现,则使用默认的通用相等比较器 EqualityComparer.Default。如果类型 TKey 实现 System.IEquatable 泛型接口,则默认相等比较器使用该实现。

我希望这意味着 TrustedEntityReference 应该实现IEqualityComparer接口(尽管我会同时实现ICompariable)。您还可以使用Dictionary(IEqualityComparer)构造函数
指定您自己的。

这些接口中的方法必须始终返回相同的值,即使对象的值已更改。

http://msdn.microsoft.com/en-us/library/ms132072.aspx

如果您需要更多,请告诉我。

于 2012-10-16T16:59:48.317 回答
0

所以主要的事情是覆盖 GetHashCode 和 Equals (不包括排序的东西)。接下来要确保的是,一旦从 GetHashCode 返回了一个值,即使在该对象的生命周期内,您也需要返回相同的值,即使它生成的值已被修改。

对于排序,您应该只需要 IComparable 作为默认比较器,或者您可以给它自己的比较器实例。

于 2012-10-16T17:00:27.777 回答