C# 我必须实现哪些接口才能列出<;T>;或字典<;T>;将两个值连接为键

C# 我必须实现哪些接口才能列出<;T>;或字典<;T>;将两个值连接为键,c#,gethashcode,icomparable,iequalitycomparer,iequatable,C#,Gethashcode,Icomparable,Iequalitycomparer,Iequatable,我需要使我的自定义对象在字典、列表等中正常工作。。。这样我就可以更改对象的属性,并允许重新调用它,而不是孤立 上次尝试重写GetHashCode()时,我在将对象添加到字典时孤立了对象,对对象进行了更改(更改了GetHashCode),这导致字典无法从内存中正确处理对象 问题 谁能解释一下: 我需要在TrustedEntityReference中重写哪些接口和接口,以连接int和TrustedEntity在排序字典中正常工作 对于.NET dictionary对象中使用的内容,哪些值不能更改,

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

上次尝试重写GetHashCode()时,我在将对象添加到字典时孤立了对象,对对象进行了更改(更改了GetHashCode),这导致字典无法从内存中正确处理对象

问题

谁能解释一下:

  • 我需要在TrustedEntityReference中重写哪些接口和接口,以连接
    int
    TrustedEntity
    在排序字典中正常工作

  • 对于.NET dictionary对象中使用的内容,哪些值不能更改,否则可能导致对象孤立?(例如,更改对象发出的哈希代码可能会导致字典出现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; }


    }
}
名称空间模型
{
公共阶级信任
{
公众信任()
{
this.BackTrustLink=新列表();
this.ForwardTrustLink=新列表();
}
公共列表反向信任链接{get;set;}
公共字符串入口名{get;set;}
公共列表转发信任链接{get;set;}
}
//这就是我希望在上面列表中被视为“键”的对象
//如果将重复的TrustedEntityReference插入到trustedEntity.BackTrustLink或trustedEntity.ForwardTrustLink中,我希望发生重复对象异常
公共类TrustedEntityReference
{
public int HierarchyDepth{get;set;}
公共信任度信任度{get;set;}
}
}

无需任何接口即可使用或

TKey无法更改(否则您将无法在字典中找到条目,因为您将查找错误的密钥)

编辑
看来我错过了TKey类型

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

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

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


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

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


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

您实际上根本不需要做任何特殊的事情,前提是重复数据不是问题(或者是因为它没有发生,或者是因为其他东西正在强制执行它,或者是因为您希望它多次出现)

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


因此,对于您的示例,如果您使用相同的初始数据填充
列表
,则不会出现问题。如果他们各自加载自己的数据集,这将没有帮助。

我不确定您的问题标题与问题本身的关系。我也不太清楚你在问什么。你能澄清一下吗?