2014-04-15 182 views
2

我不明白为什么没有一个本地函数来做到这一点。假设我创建了以下类:通过hashcode获取对象

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

之后,我创建一个包含了一些学生的HashSet。现在我想用他的名字从HashSet找一个学生,这个名字也是使用的哈希码,没有列举。这可能吗?如果是这样,我该如何做到这一点?由于学生的姓名被用作哈希码,因此应该可以使用O(1)操作,对吗?

+0

使用HashSet.Contains()。这是摊销O(1)。 –

+1

使用'字典<字符串,学生>',你可以得到'myDictionary [“name”]' –

+0

@ Siriam的值我想这可以工作,但它会产生一致性问题。如果字典的关键字与对象的名称不同,该怎么办?如果没有其他的解决办法,我想我必须解决这个解决方案。谢谢! –

回答

3

而不是使用HashSet(或字典)来存储您的学生使用KeyedCollection来代替。

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

这将让你的名字迅速做查找就像一个字典,但你并不需要手动配对名称与当你插入钥匙。但请注意,没有两个学生可以使用相同的名称,否则会出现错误(就像您使用词典并使用两名同名学生一样)。

+0

实际上不是数组的数组。 IIRC,它是一系列链表(或者类似于链表),无论如何。 –

+0

我大大简化了我的答案,如果您想了解更多关于HashSet的工作原理,请查看修订历史记录。 –

+0

这似乎正是我要找的!现在就去测试它,如果它看起来一样好,可能会选择这个答案! –

5

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

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

+0

哈希码确实是一个标识符。事实上,我可以通过比较哈希代码来检查我的'HashSet '中是否存在项目... – Haney

+0

由于密钥取决于值的属性,KeyedCollection会比字典更好。 –

+1

@DavidHaney哈希码没有 - 也不能 - 唯一标识一个项目。 –