Une alternative intelligente à LINQ pour itérer sur HashSet
Question
J'ai une liste blanche d'URL que je utilise, dans un HashSet<string>
. Je suis en train de trouver si le url
commence par l'un des éléments dans la liste blanche (il doit être ce tour à sens unique).
Edit:. L'exemple précédent était un peu trompeur et avait une faute de frappe - je l'ai déjà une URL de base comme yahoo.com, la liste blanche est juste le chemin
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;
}
}
Y at-il une façon plus élégante de faire cette recherche avec LINQ (objets)? La liste n'est pas énorme si les performances ne sont pas un problème.
La solution
bool validUrl = whiteList.Any(item => linkUrl.StartsWith(item));
Par ailleurs, en général, les tables de hachage ne sont pas bonnes structures de données pour ce genre de problèmes (où vous n'avez pas la clé et sont correspondant à la clé basée sur une fonction) que vous devrez énumérer l'ensemble la table tout le temps. Vous pouvez utiliser un simple List<string>
pour contenir les éléments à la place et vous obtiendrez de meilleures performances.
Autres conseils
La question est ici à la recherche. Avez-vous une certaine régularité dans la liste blanche? i.e. ce que ce sera toujours un domaine que vous êtes après, pas neccessarily les pages ou dans un sous-domaine spécifique?
Si vous pouviez donc utiliser un string.split pour saisir la première partie de l'URL de votre chaîne, puis utilisez la méthode .Contains () de votre HashSet pour obtenir l'élément. Cela supprimerait la commande qui est exécutée une fois pour chaque élément dans la liste, et une chaîne chère string.StartsWith () comparer, et le remplacer par un hors string.split et un O (1) recherche de votre HashSet.
HashSet<string> whiteList = new HashSet<string>();
//add items
string urlStartsWith = "http://www.yahoo.com";
bool validURL = whiteList.Contains(url);