質問
再設計中の大規模なWebサイト用にカスタム404ページを作成しています。顧客がブックマークした可能性のある約40の使用頻度の高いページがあり、新しいサイト構造によってこれらのブックマークが壊れます。
カスタム404ページで、古いURLを使用してこれらの使用頻度の高いページの1つに移動しようとした場合、新しいURLを通知したいと思います。 404ページには、<!> quot; did-you-want-this?<!> quot;の動的コントロールがいくつかあります。ダイアログのタイプ、および<!> quot; if-so-go-here(およびブックマークを更新)<!> quot;ダイアログのタイプ。それは簡単な部分です。
新しいURLを提案するために、リクエストされたURLを見ています。キーワードが含まれている場合は、それに基づいて新しいURLを提案し、404で適切な「やりたいこと...」と「もしそうなら...」という提案を実行します上記のページ。
だから、これらの40のようなキー/値のペア(キーワード/新しいURLのペア)をデータ構造に保存したいのですが、何が最適かわかりません。辞書? IDictionary?違いは何ですか、どちらがより適切ですか?
または、私は完全に間違った方向に進んでいますか?
お時間をいただきありがとうございます。
解決
辞書を使用します<!> lt; T、T <!> gt; System.Collections.Generic名前空間から。
他のヒント
NameValueCollectionを使用できます。
これはあなたのユースケースにとっては多すぎるかもしれませんが、私はおそらくUriごとに複数のキーワードと相対的な重みスコアを許可します。次に、一致するキーワードを動的にスコア付けします。
class UriSuggester {
private List<SuggestedUri> Uris { get; set; }
Uri[] GetSuggestions(Uri originalUri) {
var suggestionHits = new Dictionary<SuggestedUri, int>();
foreach (var keyword in KeyWords.Parse(originalUri)) {
// find suggestions matching that keyword
foreach (var suggestedUri in Uris.Where(u => u.Keywords.Contains(keyword)) {
// add a hit for keyword match
suggestionHits[suggestedUri] += 1;
}
}
// order by weight * hits
return suggestionHits.Keys
.OrderBy(s => s.Weight * suggestionHits[s])
.Select(s => s.Uri)
.ToArray();
}
}
class SuggestedUri {
public Uri Suggested { get; set; }
public int Weight { get; set; }
public Keyword[] Keywords;
}
class Keyword {
public string Value { get; set; }
public static Keyword[] Parse(Uri uri);
override Equals;
override GetHashCode;
}
辞書は問題ありません。インターフェースタイプIDictionaryまたはDictionaryとして保存するかどうかは、この場合、404ページ自体を除き、あまり渡されないため、それほど重要ではありません。
古いURLを引き続きサポートするために、URLの書き換えを行うことを検討しましたか?
独自のクラスロジックを作成し、それを次のようにListデータ構造に割り当てることを検討できます。
public class KeyValuesClass
{
private string a_key;
private string a_value;
public KeyValuesClass(string a_key, string a_value)
{
this.a_key = a_key;
this.a_value = a_value;
}
public string Key
{
get{ return a_key; }
set { a_key = value; }
}
public string Value
{
get{ return a_value; }
set { a_value = value; }
}
}
コードのどこか
List<KeyValuesClass> my_key_value_list = new List<KeyValuesClass>();
my_key_value_list.Add(new KeyValuesClass("key", "value");
しかし、私たちの仲間のプログラマーが上で述べたように、辞書を検討することができます:)