Chiave / Elenco valori ASP.NET
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.
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 :)