2012-02-03 13 views
2

私は製品販売Webサイトのために私自身の特定のWebクローラーを作成しています。彼らの非常に悪いコーディングの性質のために、私は同じページを指すURLを得ることで得る。同じ要素が複数回含まれているかどうかの文字列リストを見つける

上記のページはあなたが'/'文字を経由して分割したときに、それは2 "bilgisayar" 要素が含まれて見ることができるように

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

以下と同じです。たとえば、例1

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

だから私が望むのは、このようなURLを分割したいのです。

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

その後、そのリストに同じ要素が複数回含まれているかどうかを確認します。任意の要素。私はすでに他のページから抽出された実際のURLを持っていたので、任意の要素が含まれている場合、私はURLをスキップします。では、これを行う最善の方法は何ですか?長い

が、作業バージョン

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'回以上同じ項​​目が含まれているかどうかを確認したいですか?または、以前の実行で見たことのあるアイテムが含まれているかどうかチェックしますか? –

+0

同じ商品を複数回それはそれがある任意の項目にすることができます – MonsterMMORPG

答えて

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

これは、グループ化するよりも高速であるべきです。

HashSet<T>に項目を追加する独自の拡張メソッドを作成すると、さらに高速化できます。Add()がfalseを返すとすぐにfalseを返します。

あなたも、邪悪な速記使用していることを行うことができます。

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

ありがとう。素晴らしい仕事。 if(lstSPlit.Distinct()。Count() MonsterMMORPG

+0

こんにちは。非常に重要な別の問題。長さ制限を追加する必要もあります。たとえば、これがurlとして与えられた場合:http://www.exa.com.tr/空の文字列が2つあり、それをスキップします。だから私は要素の長さが2より大きいと言う必要があります。 – MonsterMMORPG

+0

@MonsterMMORPG: 'Where'を両側に置いてください。ハッシュセットのバージョンはさらに効率的になります。 – SLaks

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

答えをありがとう。私はSLaksメソッドがより速く動作すると思います:) – MonsterMMORPG

関連する問題