我在HashSet<string>
内有一个我正在使用的网址白名单。我试图找出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(对象)进行此查找是否有更优雅的方法?该列表并不大,因此性能不是问题。
答案 0 :(得分:12)
bool validUrl = whiteList.Any(item => linkUrl.StartsWith(item));
顺便说一下,一般来说,哈希表不是这类问题的好数据结构(你没有密钥并且基于函数匹配密钥),因为你必须枚举整个一直都是桌子。您可以使用简单的List<string>
代替项目,这样您就可以获得更好的效果。
答案 1 :(得分:1)
这里的问题是查找。你在白名单中有规律吗?即它总是一个你所追求的领域,而不是必然的页面或特定的子域?
如果是这样,你可以使用string.split从字符串中获取第一个URL部分,然后使用hashset的.Contains()方法获取项目。这将删除string.StartsWith()命令,该命令对列表中的每个元素运行一次,并且进行昂贵的字符串比较,并将其替换为一个关闭的string.split和一个O(1)查找的hashset。
HashSet<string> whiteList = new HashSet<string>();
//add items
string urlStartsWith = "http://www.yahoo.com";
bool validURL = whiteList.Contains(url);