Умная альтернатива в LINQ для перебора HashSet<string>

StackOverflow https://stackoverflow.com/questions/2036683

  •  19-09-2019
  •  | 
  •  

Вопрос

У меня есть белый список URL-адресов, которые я использую, внутри HashSet<string>.Я пытаюсь найти, если url начинается с любого элемента белого списка (так и должно быть).

Редактировать: Предыдущий пример немного вводил в заблуждение и содержал опечатку: у меня уже есть базовый URL-адрес, например yahoo.com, белый список — это просто путь.

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;
    }
}

Есть ли более элегантный способ выполнить этот поиск с помощью LINQ (к объектам)?Список невелик, поэтому производительность не является проблемой.

Это было полезно?

Решение

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

Кстати, в целом хеш-таблицы не являются хорошими структурами данных для подобных задач (когда у вас нет ключа и вы сопоставляете ключ на основе функции), так как вам придется перечислять всю таблицу все время.Вы можете использовать простой List<string> вместо этого удерживайте предметы, и вы получите лучшую производительность.

Другие советы

Проблема здесь в поиске.Есть ли у вас закономерность в белом списке?то есть всегда ли вам нужен домен, а не обязательно страницы внутри или конкретный поддомен?

Если это так, вы можете использовать string.split, чтобы получить первую часть URL-адреса из вашей строки, а затем использовать метод .Contains() вашего хэш-набора, чтобы получить элемент.Это приведет к удалению команды string.StartsWith(), которая запускается один раз для каждого элемента в списке, и дорогостоящему сравнению строк, и заменит ее одноразовым string.split и поиском O (1) вашего хеш-набора.

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

string urlStartsWith = "http://www.yahoo.com";
bool validURL = whiteList.Contains(url);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top