2012-05-14 19 views
-3

可能重複:
Check if a List already contains an item or not?檢查列表<string>中是否存在相同的項目?

for (int i = 0; i < webSites.Count(); i++) 
       { 
        string t = webSites[i]; 

        webCrawler(t, levels - 1); 
        // csFiles.add 
       } 
       MessageBox.Show(webSites.Count().ToString()); 
       return csFiles; 

讓在網站說我有:

www.google.com

www.microsoft.com

現在在第二級讓我們說再次www.google.com存在,所以這次我不想處理它做recrusive,如果它將做到一遍又一遍同樣的事情。我需要設法或檢查它會做每個鏈接一次。我如何檢查它?

我不需要檢查是否該項目已經存在於列表中我需要檢查它是否已經存在,所以不要再做它,因爲它會再次挖掘相同的鏈接並重復它自我。

+0

你讓很多問題聽起來很像你只是想知道該項目是否已經存在於列表中,而不像你只想處理每個值一次。 – Panzercrisis

回答

0

創建一個臨時列表並調用它,比方說,「temp」。 for循環的每次迭代,查看webSites中該位置的字符串是否已經處於臨時狀態。如果是,請忽略它。如果不是,請將其添加到temp中,然後處理它。

編輯:顯然這不是最好的辦法。

+1

,但它被標記爲答案..:D – Baz1nga

4

List.Contains方法是你需要什麼,我猜,但

List.Contains爲O(n),我會建議一個HashSet,而不是具有O(1)查找..

如果清單中所有的條目,然後你也可以使用Linq中的含混()函數將返回一個枚舉,只有不同的元素..

webSites.Distinct() 
+0

我不理解否定票。是的,我給了他的問題的直接答案,然後使用相同的替代品的缺點..更多可以1做..:/ – Baz1nga

+0

人們嫉妒你的正確答案。 –

+0

我想這只是因爲即使很多問題聽起來像是他正在查看字符串是否已經在那裏,他實際上只是想確保相同的值不會被處理多次。 – Panzercrisis

1

保持在一個HashSet<string>參觀項目。

在訪問頁面時使用Add,在檢查您是否已訪問該頁面時使用Contains

8

不要使用名單這一點 - 使用Hashset<string> - 爲列表這有望O(1)查找時間,而不是爲O(n)的,真正的「設置」比喻完全吻合:

HashSet<string> visitedPages = new HashSet<string>(); 
for (int i = 0; i < webSites.Count(); i++) 
{ 
    string page = webSites[i]; 
    if(visitedPages.Add(page)) //returns true if new page was added 
    { 
     webCrawler(page, levels - 1); 
    } 
} 

如果以遞歸方式調用此方法,當然visitedPages散列集的聲明必須在方法外部,例如使其成爲一個成員變量,以便您可以維護已訪問頁面的歷史記錄。

+0

'if(!visitsPages.Contains(page)) { visitedPages.Add(page);'應該改爲'if(visitedPages.Add(page)) {' –

+0

@TimS .: yes that would a a良好的重構和保存一個查找 - 編輯在 – BrokenGlass

0

爲什麼不直接選擇不同的網站列表?

foreach (var site in webSites.GroupBy(s => s)) 
{ 
    webCrawler(t, levels - 1); 
    // csFiles.add 
} 
MessageBox.Show(webSites.Count().ToString()); 
return csFiles;