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() メソッドを使用して項目を取得できます。これにより、リスト内のすべての要素に対して 1 回実行される string.StartsWith() コマンドと、高価な文字列比較が削除され、1 回限りの 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 に答える