2012-02-03 1 views
2

제품 판매 웹 사이트에 대한 고유 한 웹 크롤러를 작성하고 있습니다. 그들의 아주 나쁜 코딩 성격으로 인해 나는 같은 페이지를 가리키는 URL을 얻는다.동일한 요소가 두 번 이상 포함되어 있는지 여부를 문자열 목록 찾기

상기 페이지는 사용자가 '/' 문자로 나눌 때 2 "bilgisayar"엘리먼트가 포함시피

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

이하와 같은 예를 들어 일례

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을 가지고 있기 때문에 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) 

이 빠르게 그룹화보다해야한다. (측정하지 못했습니다) 에 항목을 추가하는 고유 한 확장 방법을 작성하면 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