LINQ中的一个聪明的替代方法,用于迭代HashSet <string> </string>

时间:2010-01-10 10:20:46

标签: c# linq hashset

我在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(对象)进行此查找是否有更优雅的方法?该列表并不大,因此性能不是问题。

2 个答案:

答案 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);