4

我有一个我正在使用的 URL 的白名单,在HashSet<string>. 我正在尝试查找是否以url白名单中的任何项目开头(必须如此)。

编辑:前面的例子有点误导并且有一个错字——我已经有一个像 yahoo.com 这样的基本 url,白名单只是路径。

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(对象)进行此查找?该列表并不大,因此性能不是问题。

4

2 回答 2

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

顺便说一下,一般来说,哈希表不是解决这类问题的好数据结构(你没有键并且基于函数匹配键),因为你必须枚举整个表时间。您可以使用简单List<string>的来代替物品,您将获得更好的性能。

于 2010-01-10T10:21:35.347 回答
1

这里的问题在于查找。白名单有规律吗?即它是否始终是您所追求的域,而不一定是其中的页面或特定的子域?

如果是这样,您可以使用 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);
于 2010-01-10T10:41:14.687 回答