Умная альтернатива в LINQ для перебора HashSet<string>
Вопрос
У меня есть белый список 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);