Pergunta

Eu tenho uma lista branca de URLs que estou usando, dentro de um HashSet<string>. Eu estou tentando descobrir se os url começa com qualquer um dos itens na lista branca (que tem que ser assim e volta).

Editar:. O exemplo anterior foi um pouco enganador, e tinha um erro de digitação - Já tenho uma url base como yahoo.com, a lista branca é apenas o caminho

HashSet<string> whiteList = new HashSet<string>();

string path = "/sport/baseball/";
bool validUrl = false;

foreach (string item in whiteList)
{
    if (path.StartsWith(item))
    {
        validUrl = true;
        break;
    }
}

Existe uma maneira mais elegante de fazer essa pesquisa com LINQ (para objetos)? A lista não é enorme por isso o desempenho não é um problema.

Foi útil?

Solução

bool validUrl = whiteList.Any(item => linkUrl.StartsWith(item));

A propósito, em geral, tabelas hash não são boas estruturas de dados para este tipo de problemas (onde você não tem a chave e estão combinando a chave com base em uma função) como você vai ter para enumerar o conjunto mesa o tempo todo. Você pode usar um List<string> simples para manter os itens em vez e você vai ter um melhor desempenho.

Outras dicas

A questão aqui é com a pesquisa. Você tem alguma regularidade na whitelist? ou seja, será sempre um domínio que você está depois, não neccessarily as páginas dentro ou um subdomínio específico?

Se assim você poderia usar um string.split para agarrar a primeira parte URL de sua corda, em seguida, usar o método .Contains () do seu hashset para obter o item. Isso eliminaria o comando String.StartsWith () que é executado uma vez para cada elemento na lista, e uma string caros comparar, e substituí-lo com um largo string.split e O (1) lookup do seu hashset.

HashSet<string> whiteList = new HashSet<string>();
//add items

string urlStartsWith = "http://www.yahoo.com";
bool validURL = whiteList.Contains(url);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top