2011-02-25 38 views
2

我需要实现一个有效的o(1)搜索算法。如果我使用HashSet,并且会尝试通过User.FirstName进行搜索,例如它是否正确?如果没有,请给我一个建议,我怎么才能实现这个搜索?查找速度通用

+1

您可能需要'Dictionary '来代替。 –

+2

@Ben:不,如果你使用FirstName,你会得到重复的键... –

+0

@Reed:真的,你想要的东西沿'unordered_multimap'的行...我不认为任何提供。净。 –

回答

3

您需要使用Dictionary<TKey,TValue>,其中TKey构建在搜索类型上。但是,如果您使用的内容类似FirstName作为搜索词,您可能会使用同一个键具有多个值,这会导致问题。

可能更好的选择是使用ToLookup为您生成ILookup。例如:

IEnumerable<Person> people = GetPeople(); 

var nameLookup = people.ToLookup(p => p.FirstName); 

你可以再做:

var peopleNamedFred = nameLookup["Fred"]; 
foreach(var fred in peopleNamedFred) 
    Console.WriteLine("{0} {1}, fred.FirstName, fred.LastName); 
+0

LookUp是不可变的。这对一些用途很好,但是对其他用户不可用。 – CodesInChaos

+0

@CodeInChaos:True - 如果数据更改,则必须重新生成ILookup。话虽如此,如果需要,你可以使用'字典>'来制作自己的ILookup。 –

0

创建的System.Collections.ObjectModel.KeyedCollection的实现。
根据MSDN reference它“提供了O(1)索引检索和接近O(1)的密钥检索”。但是,它仍然具有Dictionary' and HashTable`具有重复键不被允许的限制。如果您需要重复的键值,或者您需要能够在不同的时间使用不同的项目作为键,那么Reed Copsey提供了一个非常好的解决方案。