通过哈希码获取对象

时间:2014-04-15 19:17:33

标签: c# hash hashcode

我不明白为什么没有本地功能来执行此操作。假设我创建了以下类:

public class Student {
     public string Name {get; set;}
     public override int GetHashCode() {
         return(Name.GetHashCode());
     }
}

之后,我创建了一个包含许多学生的HashSet。现在我想让HashSet的学生使用他的名字,这也是使用的哈希码,没有枚举。这可能吗?如果是,我将如何实现这一目标?由于学生的名字被用作哈希码,这应该可以通过O(1)操作来实现,对吗?

2 个答案:

答案 0 :(得分:5)

哈希码唯一标识符。不同的对象可以具有相同的哈希码。对哈希码的唯一要求是被认为相等的对象具有相同的哈希码。

如果您需要O(1)根据密钥检索项目,请使用Dictionary<TKey, TValue>,而不是HashSet<T>

答案 1 :(得分:3)

而不是使用HashSet(或词典)来存储学生,而是使用KeyedCollection代替。

public class StudentCollection : KeyedCollection<string, Student>
{
    protected override string GetKeyForItem(Student item)
    {
        return student.Name;
    }
}

这将允许您像字典一样快速查找名称,但在插入时无需手动将名称与密钥配对。但请注意,没有两个学生可以使用相同的名称,否则您将收到错误(就像您有一个词典并使用两个同名学生一样)。