通常與哈希表我做的:檢查,如果列表<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