2009-10-12 48 views
2

通常与哈希表我做的:检查,如果列表<MyObject>已经在收集

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

如果我有一个名单,我怎么能检查使用含有?

现在我只是创建一个用户ID的哈希表,并检查,但有没有一种方法只是使用列表?

回答

7

您可以使用List<T>.Contains - 请注意,它将是一个线性搜索,即O(N)而不是O(1)的一个HashMap。如果你的清单不是太大,这不太可能是个问题。当然,除非您对参考身份感到满意,否则您仍然需要这些项目才能正确覆盖Equals

如果你有一个大的列表,你需要做重复的遏制测试,你可能只是想从现有的列表中创建一个HashSet<T>。如果您要在操作列表的过程中进行很多操作,您可能需要将列表和集合一起封装在您自己的集合中。你需要弄清楚你想要哪种语义 - 如果你两次添加相同的ID,你想要发生什么?第二个电话应该被忽略吗?如果你不能这样做,那么更好:)

4

List.Contains没有工作的原因吗?

if (!myList.Contains(someId)) { 
    ... 
} 

如果ID是myObject的属性,那么你可以做以下

if (!myList.Any(x => x.Id == someId)) { 
    ... 
} 
1

可以使用List.Contains方法。但是请注意,此方法执行线性搜索,因此比Hashtable更慢。如果您拥有大量用户,请考虑使用HashSet

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(); 
+0

woohoo for Linq! – Gabe 2009-10-12 17:09:12

+0

实际上,这不是使用LINQ,而是使用lambda运算符来创建内联委托方法。 JaredPar使用.Any方法的例子是LINQ。 – 2009-10-12 17:13:27

相关问题