HashSetの<文字列>を反復処理するためのLINQで賢い選択肢
質問
私はHashSet<string>
内で、使用しているURLのホワイトリストを持っています。私は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を使用してこの検索を行うためのよりエレガントな方法はありますか?リストは巨大ではないので、パフォーマンスが問題ではありません。
解決
bool validUrl = whiteList.Any(item => linkUrl.StartsWith(item));
はところで、一般的には、ハッシュテーブルを使用すると、全体を列挙する必要がありますよう(あなたがキーを持っていないと機能に基づいて、鍵を一致している)問題のこれらの種類のための良好なデータ構造ではありませんテーブルのすべての時間。代わりにアイテムを保持するために、あなたがより良いパフォーマンスを得ることができます簡単なList<string>
を使用することができます。
他のヒント
ここでの問題は、ルックアップです。あなたはホワイトリスト内のすべての規則性を持っていますか?すなわちそれは常にではないneccessarily内のページや特定のサブドメイン、あなたは後にしているドメインになりますか?
あなたはアイテムを得るためにあなたのHashSetの.Contains()メソッドを使用し、その後、あなたの文字列から最初のURLの一部をつかむためのstring.Splitを使用することができますもしそうなら。これは、リスト内のすべての要素のために一度実行されstring.StartsWith()コマンドを除去するであろう、と高価な文字列が比較して、1オフのstring.SplitとあなたのHashSetのO(1)のルックアップと交換してください。
HashSet<string> whiteList = new HashSet<string>();
//add items
string urlStartsWith = "http://www.yahoo.com";
bool validURL = whiteList.Contains(url);