2012-02-03 128 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

相关问题