2009-10-12 49 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

相關問題