Ключ ASP.NET / список значений
Вопрос
Я делаю пользовательскую страницу 404 для большого сайта, который подвергается редизайну. Существует около 40 страниц с высоким уровнем использования, которые клиенты могут добавить в закладки, и наша новая структура сайта сломает эти закладки. Р>
На моей пользовательской странице 404 я хочу предупредить их о новом URL-адресе, если они попытаются перейти на одну из этих популярных страниц по ее старому URL-адресу. Итак, у меня есть пара динамических элементов управления на странице 404, один для & Quot; did-you-want-this? & Quot; тип диалога и другой для " if-so-go-here (и обновите вашу закладку) " тип диалога. Это легкая часть.
Чтобы предложить новый URL, я просматриваю запрашиваемый URL. Если в нем есть ключевые слова, я собираюсь предложить новый URL, основанный на этом, и на них я запускаю соответствующие предложения "сделал, что ты хочешь ...", и если это так ... на 404 страница, как указано выше. Р>
Итак, я хочу сохранить эти 40-ключовые пары ключ / значение ( пары ключевое слово / новый-URL ) в структуре данных, и я не уверен, что будет лучше. Толковый словарь? IDictionary? Какая разница и что более уместно?
Или я совершенно не на том пути?
Спасибо за ваше время.
Решение
Я бы использовал словарь < T, T > из пространства имен 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 или сам словарь, в этом случае не будет иметь большого значения, так как он не будет широко распространяться, кроме как на самой странице 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");
Но вы можете рассматривать словарь так, как наш коллега-программист упомянул это выше:)