Frage

Ich habe eine weiße Liste von URLs habe ich verwende, in einem HashSet<string>. Ich versuche, mit einem der Elemente in der weißen Liste, wenn der url beginnt zu finden (es auf diese Weise rund sein muss).

Edit:. Das obige Beispiel wurde ein wenig irreführend und hatte einen Tippfehler - Ich habe bereits eine Basis-URL wie yahoo.com, weiße Liste der ist nur der Pfad

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

Gibt es eine elegantere Möglichkeit, diese Lookup mit LINQ zu tun (auf Objekte)? Die Liste ist nicht sehr groß, so Leistung ist kein Problem.

War es hilfreich?

Lösung

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

Durch die Art und Weise, in der Regel Hash-Tabellen sind nicht gut Datenstrukturen für diese Art von Problemen (wo man den Schlüssel nicht und passen Sie den Schlüssel auf der Grundlage einer Funktion), wie Sie die ganze aufzählen müssen werde Tisch die ganze Zeit. Sie können einen einfachen List<string> verwenden Sie die Elemente statt zu halten, und Sie werden eine bessere Leistung erhalten.

Andere Tipps

Die Frage ist hier mit dem Nachschlag. Sie haben keine Regelmäßigkeit in der weißen Liste? das heißt es wird immer eine Domain, die Sie nach sind, müssen nicht zwangsläufig die Seiten innerhalb oder eine bestimmte Sub-Domain?

Wenn so dass Sie einen string.split verwenden könnte die erste URL Teil aus der Zeichenfolge zu packen, dann verwenden Sie die .Contains () -Methode Ihrer Hashset das Element zu erhalten. Dies würde die String.StartsWith () Befehl entfernen, die einmal für jedes Element in der Liste geführt wird, und ein teurer String vergleichen, und ersetzt sie durch eine einmalige string.split und einen O (1) Lookup Ihrer Hashset.

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

string urlStartsWith = "http://www.yahoo.com";
bool validURL = whiteList.Contains(url);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top