Найти список строк, содержащих один и тот же элемент более одного раза - PullRequest
2 голосов
/ 03 февраля 2012

Я пишу свой собственный специальный сканер для веб-сайтов по продаже товаров. Из-за их очень плохой природы кодирования я получаю URL, указывающие на одну и ту же страницу.

Пример один

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", когда вы разделяете с помощью '/' символа

Так что я хочу, я хочу разделить 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;
        }
    }
}

Ответы [ 2 ]

5 голосов
/ 03 февраля 2012
if (list.Distinct().Count() < list.Count)

Это должно быть быстрее, чем группировка.(Я не измерял)

Вы можете сделать это еще быстрее, написав свой собственный метод расширения, который добавляет элементы в HashSet<T> и немедленно возвращает false, если Add() возвращает false.

Вы можете даже сделать это, используя злую стенографию:

if (!list.All(new HashSet<string>().Add))
2 голосов
/ 03 февраля 2012
if(lstSPlit.GroupBy(i => i).Where(g => g.Count() > 1).Any())
{
    // found more than once
}
...