Ключ ASP.NET / список значений - PullRequest
       10

Ключ ASP.NET / список значений

3 голосов
/ 20 октября 2008

Я делаю пользовательскую страницу 404 для большого сайта, который подвергается редизайну. Существует около 40 страниц с высоким уровнем использования, которые клиенты могут добавить в закладки, и наша новая структура сайта сломает эти закладки.

На моей пользовательской странице 404 я хочу предупредить их о новом URL-адресе, если они попытаются перейти на одну из этих часто используемых страниц по ее старому URL-адресу. Итак, у меня есть пара динамических элементов управления на странице 404, один для "сделал-ты-хочешь-это?" тип диалога, и другой для типа диалога «если так пойдут (и обновите вашу закладку)». Это легкая часть.

Чтобы предложить новый URL, я смотрю на запрошенный URL. Если в нем есть ключевые слова, я собираюсь предложить новый URL, основанный на этом, и на них я запускаю соответствующие предложения "сделал, что ты хочешь ...", и если это так ... на 404 страница, как указано выше.

Итак, я хочу сохранить эти 40-ключовые пары ключ / значение ( ключевые слова / новые URL-пары ) в структуре данных, и я не уверен, что будет лучше. Толковый словарь? IDictionary? Какая разница и какая уместнее?

Или я совершенно не на том пути?

Спасибо за ваше время.

Ответы [ 5 ]

4 голосов
/ 20 октября 2008

Я бы использовал словарь из пространства имен System.Collections.Generic.

2 голосов
/ 20 октября 2008

Возможно, это излишне для вашего случая использования, но я бы, вероятно, учел несколько ключевых слов на 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;
}
2 голосов
/ 20 октября 2008

Вы можете использовать NameValueCollection.

1 голос
/ 20 октября 2008

Вы можете написать собственную логику класса, а затем назначить ее структуре данных 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");

Но вы можете рассматривать словарь, как наш коллега-программист упомянул об этом выше:)

1 голос
/ 20 октября 2008

Словарь будет хорошо. Вне зависимости от того, сохраните ли вы его как интерфейсный тип IDictionary или сам словарь, в этом случае не будет иметь большого значения, так как он не будет широко распространяться, кроме как на самой странице 404.

Рассматривали ли вы переписывание URL-адресов для поддержки старых URL-адресов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...