Domanda

Sto realizzando una pagina 404 personalizzata per un sito Web di grandi dimensioni in fase di riprogettazione. Esistono circa 40 pagine ad alto utilizzo che i clienti possono aver aggiunto ai segnalibri e la nostra nuova struttura del sito interromperà questi segnalibri.

Nella mia pagina 404 personalizzata, desidero avvisarli del nuovo URL se tentano di accedere a una di queste pagine ad alto utilizzo tramite il suo vecchio URL. Quindi ho un paio di controlli dinamici sulla pagina 404, uno per un & Quot; did-you-want-this? & Quot; tipo di finestra di dialogo e un altro per un " if-so-go-here (e aggiorna il tuo segnalibro) " tipo di dialogo. Questa è la parte facile.

Per suggerire un nuovo URL, sto guardando l'URL richiesto. Se contiene parole chiave, suggerirò il nuovo URL in base a quello, e li sto licenziando gli opportuni suggerimenti did-you-want ..., e if-so ... sul 404 pagina come menzionato sopra.

Quindi voglio archiviare queste coppie chiave / valore di 40 ish ( coppie parola chiave / nuovo URL ) in una struttura di dati, e non sono sicuro di quale sarebbe il migliore. Dizionario? IDictionary? Qual è la differenza e quale è più appropriato?

O sono totalmente sulla strada sbagliata?

Grazie per il tuo tempo.

È stato utile?

Soluzione

Vorrei usare il Dizionario < T, T > dallo spazio dei nomi System.Collections.Generic.

Altri suggerimenti

È possibile utilizzare NameValueCollection.

Forse questo è eccessivo per il tuo caso d'uso, ma probabilmente consentirei più parole chiave per Uri e un punteggio di peso relativo. Quindi, segna dinamicamente le parole chiave corrispondenti.

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

Il dizionario andrebbe bene. Se lo memorizzi come tipo di interfaccia IDictionary o Dizionario stesso non importerebbe molto in questo caso in quanto non verrà passato molto in giro, oltre alla pagina 404 stessa.

Hai pensato di riscrivere gli URL per supportare ancora i vecchi URL?

Puoi considerare di scrivere la tua logica di classe e quindi assegnarla a una struttura di dati Elenco come segue:

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

}

da qualche parte nel codice

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

Ma puoi considerare Dictionary come il nostro collega programmatore lo ha menzionato sopra :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top