2012-02-03 127 views
2

我正在爲產品銷售網站編寫自己的特定網絡爬蟲。由於他們的編碼性質非常糟糕,我得到的網址指向相同的頁面。找到一個字符串列表是否包含多個相同的元素

例一

http://www.hizlial.com/bilgisayar/bilgisayar-bilesenleri/bilgisayar/yazicilar/samsung-scx-3200-tarayici-fotokopi-lazer-yazici_30.033.1271.0043.htm 

例如上面的頁是相同的,如下

http://www.hizlial.com/bilgisayar-bilesenleri/bilgisayar/yazicilar/samsung-scx-3200-tarayici-fotokopi-lazer-yazici_30.033.1271.0043.htm 

正如你可以看到它含有2 「bilgisayar」 元件時,通過'/'字符分割

所以我想要的是我想拆分這樣的網址

string[] lstSPlit = srURL.Split('/'); 

之後,檢查該列表是否多次包含相同的元素。任何元素。如果包含任何元素,我將跳過網址,因爲我已經有了從其他頁面提取的真實網址。那麼做這件事的最好方法是什麼?

較長,但工作版本

string[] lstSPlit = srHref.Split('/'); 
bool blDoNotAdd = false; 
HashSet<string> splitHashSet=new HashSet<string>(); 
foreach (var vrLstValue in lstSPlit) 
{ 
    if (vrLstValue.Length > 1) 
    { 
     if (splitHashSet.Contains(vrLstValue) == false) 
     { 
      splitHashSet.Add(vrLstValue); 
     } 
     else 
     { 
      blDoNotAdd = true; 
      break; 
     } 
    } 
} 
+0

所以要檢查是否'lstSPlit'包含相同的項目超過一次?或者你想檢查它是否包含你在之前的運行中看到的項目? – 2012-02-03 00:30:26

+0

同一個項目不止一次。它可以是它的任何項目 – MonsterMMORPG 2012-02-03 00:40:03

回答

4
if (list.Distinct().Count() < list.Count) 

這應該是比快分組。 (我沒有測量)

你可以把它寫,增加了項目的HashSet<T>並返回false如果立即Add()返回false自己的擴展方法甚至更快。

你甚至可以做到這一點使用一個邪惡的簡寫:

if (!list.All(new HashSet<string>().Add)) 
+0

非常感謝。工作很棒。更正版本「if(lstSPlit.Distinct()。Count() MonsterMMORPG 2012-02-03 00:39:40

+0

你好。另一個問題非常重要。我還需要添加長度限制。例如,當它以url:http://www.exa.com.tr/給出時,它會得到2個空字符串,並導致我跳過它。所以我不得不說,元素長度大於2例如 – MonsterMMORPG 2012-02-03 01:30:16

+0

@MonsterMMORPG:只需在兩側放置一個「Where」。哈希集版本將更加高效。 – SLaks 2012-02-03 01:33:39

2
if(lstSPlit.GroupBy(i => i).Where(g => g.Count() > 1).Any()) 
{ 
    // found more than once 
} 
+0

感謝您的答案。我想SLaks的方法會更快:) – MonsterMMORPG 2012-02-03 00:42:29

相關問題