Pergunta

Estou fazendo uma página 404 personalizada para um site grande que está passando por um redesenho. Existem cerca de 40 páginas de alto uso que os clientes podem ter marcado e nossa nova estrutura de sites quebrará esses favoritos.

Na minha página 404 personalizada, quero alertá-las para o novo URL se eles tentarem navegar para uma dessas páginas de alto uso através de seu URL antigo. Então, eu tenho alguns controles dinâmicos na página 404, um para um "Você quer que você tenha-se-visto?" Tipo de diálogo e outro para um tipo de diálogo "If-So-Go-Here (e atualize seu marcador)". Essa é a parte mais fácil.

Para sugerir um novo URL, estou olhando para o URL solicitado. Se tiver palavras-chave, vou sugerir o novo URL com base nisso, e elas estou disparando o apropriado, você quer ... e se-So ... sugestões no 404 página como mencionado acima.

Então, eu quero armazenar esses pares de chave/valor de 40 ish (Palavras-chave/pares de new-URL) em uma estrutura de dados, e não tenho certeza do que seria melhor. Dicionário? Idictionary? Qual é a diferença e qual é mais apropriado?

Ou estou totalmente na pista errada?

Obrigado pelo seu tempo.

Foi útil?

Solução

Eu usaria o dicionáriou003CT,T> do espaço de nome do System.Collection.Genérico.

Outras dicas

Você pode usar o nome NameValuEcollection.

Talvez isso seja exagerado para o seu caso de uso, mas eu provavelmente permitiria várias palavras -chave por URI e uma pontuação relativa de peso. Em seguida, pontue dinamicamente as palavras -chave que correspondem.

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;
}

O dicionário ficaria bem. Se você o armazena como o idicionário do tipo de interface ou o próprio dicionário não importaria muito neste caso, pois não será transmitido muito, além da própria página 404.

Você já pensou em fazer alguma reescrita de URL para ainda apoiar os URLs antigos?

Você pode considerar escrever sua própria lógica de classe e, em seguida, atribuí -la a uma estrutura de dados da lista como seguinte:

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; }
    }

}

Em algum lugar do código

List<KeyValuesClass> my_key_value_list = new List<KeyValuesClass>();
my_key_value_list.Add(new KeyValuesClass("key", "value");

Mas você pode considerar o dicionário como nosso colega programador mencionou acima :)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top