Pregunta

Estoy haciendo una página 404 personalizada para un sitio web grande que está siendo rediseñado. Hay alrededor de 40 páginas de alto uso que los clientes pueden haber marcado, y nuestra nueva estructura del sitio romperá estos marcadores.

En mi página 404 personalizada, quiero alertarlos sobre la nueva URL si intentan navegar a una de estas páginas de alto uso a través de su antigua URL. Así que tengo un par de controles dinámicos en la página 404, uno para un & Quot; did-you-want-this? & Quot; tipo de diálogo, y otro para un " if-so-go-here (y actualice su marcador) " tipo de diálogo Esa es la parte fácil.

Para sugerir una nueva URL, estoy mirando la URL solicitada. Si tiene palabras clave, voy a sugerir la nueva URL en función de eso, y a ellas estoy disparando las sugerencias apropiadas de si lo desea ..., y si es así ... sobre el 404 página como se mencionó anteriormente.

Así que quiero almacenar estos pares clave / valor de 40 ish ( palabra clave / nuevos pares de URL ) en una estructura de datos, y no estoy seguro de qué sería lo mejor. ¿Diccionario? IDictionary? ¿Cuál es la diferencia y cuál es más apropiada?

¿O estoy totalmente en el camino equivocado?

Gracias por su tiempo.

¿Fue útil?

Solución

Yo usaría el Diccionario < T, T > del espacio de nombres System.Collections.Generic.

Otros consejos

Puede usar NameValueCollection.

Tal vez esto sea excesivo para su caso de uso, pero probablemente permitiría varias palabras clave por Uri y un puntaje de peso relativo. Luego, califique dinámicamente las palabras clave que coinciden.

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

El diccionario estaría bien. Ya sea que lo almacene como el tipo de interfaz IDictionary o Diccionario en sí mismo, no importaría mucho en este caso, ya que no se transmitirá mucho, además de en la página 404 en sí.

¿Ha considerado hacer una reescritura de URL para aún admitir las URL antiguas?

Puede considerar escribir su propia lógica de clase y luego asignarla a una estructura de datos de la Lista de la siguiente manera:

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

}

en algún lugar del código

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

Pero puedes considerar Dictionary como nuestro compañero programador lo mencionó anteriormente :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top