通常与哈希表我做的:检查,如果列表<MyObject>已经在收集
if(!myHash.Contains(someId))
{
// insert to hash
}
如果我有一个名单,我怎么能检查使用含有?
现在我只是创建一个用户ID的哈希表,并检查,但有没有一种方法只是使用列表?
通常与哈希表我做的:检查,如果列表<MyObject>已经在收集
if(!myHash.Contains(someId))
{
// insert to hash
}
如果我有一个名单,我怎么能检查使用含有?
现在我只是创建一个用户ID的哈希表,并检查,但有没有一种方法只是使用列表?
您可以使用List<T>.Contains
- 请注意,它将是一个线性搜索,即O(N)而不是O(1)的一个HashMap
。如果你的清单不是太大,这不太可能是个问题。当然,除非您对参考身份感到满意,否则您仍然需要这些项目才能正确覆盖Equals
。
如果你有一个大的列表,你需要做重复的遏制测试,你可能只是想从现有的列表中创建一个HashSet<T>
。如果您要在操作列表的过程中进行很多操作,您可能需要将列表和集合一起封装在您自己的集合中。你需要弄清楚你想要哪种语义 - 如果你两次添加相同的ID,你想要发生什么?第二个电话应该被忽略吗?如果你不能这样做,那么更好:)
List.Contains没有工作的原因吗?
if (!myList.Contains(someId)) {
...
}
如果ID是myObject的属性,那么你可以做以下
if (!myList.Any(x => x.Id == someId)) {
...
}
可以使用List.Contains方法。但是请注意,此方法执行线性搜索,因此比Hashtable更慢。如果您拥有大量用户,请考虑使用HashSet。
你也可以做
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();
您是否考虑将其放入SortedList中,然后搜索将是二分搜索。此方法是O(log n)操作,其中n是Count。
http://msdn.microsoft.com/en-us/library/system.collections.sortedlist.contains.aspx
woohoo for Linq! – Gabe 2009-10-12 17:09:12
实际上,这不是使用LINQ,而是使用lambda运算符来创建内联委托方法。 JaredPar使用.Any方法的例子是LINQ。 – 2009-10-12 17:13:27