通常我会使用散列表:
if(!myHash.Contains(someId))
{
// insert to hash
}
如果我有一个List,我该如何使用contains?
进行检查现在我只是创建一个用户ID的哈希表,然后检查一下,但有没有办法只使用List?
答案 0 :(得分:7)
您可以使用List<T>.Contains
- 请注意它将是线性搜索,即O(N)而不是HashMap
的O(1)。如果您的列表不是太大,那么它不太可能是一个问题。当然,除非您对引用标识感到满意,否则仍需要适当地覆盖Equals
项。
如果您有一个大型列表,您需要对其进行重复包含测试,您可能只想从现有列表中创建HashSet<T>
。如果您要随意操作列表,您可能希望将列表和集合封装在您自己的集合中。你需要弄清楚你想要的语义 - 如果你两次添加相同的ID,你会想要发生什么?第二次通话应该被忽略吗?如果你能在不这样做的情况下离开,那就更好了:)
答案 1 :(得分:4)
List.Contains没有工作原因吗?
if ( !myList.Contains(someId) ) {
...
}
如果ID是MyObject上的属性,那么您可以执行以下操作
if ( !myList.Any(x => x.Id == someId) ) {
...
}
答案 2 :(得分:1)
您可以使用List.Contains方法。但请注意,此方法执行线性搜索,因此比Hashtable慢。如果您有大量用户,请考虑使用HashSet。
答案 3 :(得分:1)
您也可以
list.Find(x => x.Id == someOtherValue) != null
如果您需要C#2.0中的支持,可以像这样编写
list.Find(delegate(Agent x) { return x.Id == someOtherValue; }) != null
对于LINQ,它也可以用
完成bool listContainsId = (from item in list
where item.Id == someOtherValue
select item).Any();
答案 4 :(得分:0)
您是否考虑将其放入SortedList,然后搜索将是二进制搜索。此方法是O(log n)操作,其中n是Count。
http://msdn.microsoft.com/en-us/library/system.collections.sortedlist.contains.aspx