检查列表<myobject>是否已经在集合</myobject>中

时间:2009-10-12 16:32:06

标签: c# collections

通常我会使用散列表:

if(!myHash.Contains(someId))
{
   // insert to hash
}

如果我有一个List,我该如何使用contains?

进行检查

现在我只是创建一个用户ID的哈希表,然后检查一下,但有没有办法只使用List?

5 个答案:

答案 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