farei un metodo di estensione:
public static class DictionaryExt
{
public static IEnumerable<T> PartialMatch<T>(this Dictionary<string, T> dictionary, string partialKey)
{
// This, or use a RegEx or whatever.
IEnumerable<string> fullMatchingKeys =
dictionary.Keys.Where(currentKey => currentKey.Contains(partialKey));
List<T> returnedValues = new List<T>();
foreach (string currentKey in fullMatchingKeys)
{
returnedValues.Add(dictionary[currentKey]);
}
return returnedValues;
}
}
Il "costo" di aggiungere valori al dizionario non cambierebbe, ma il costo di recupero sarebbe stato superiore, ma solo quando sai che sei andando con una partita parziale.
Btw, sono sicuro che è possibile trasformare questo in una singola espressione Lambda, ma il concetto rimane lo stesso.
Modifica: nell'esempio, questo metodo restituisce 2 elenchi di valori, ma è possibile modificarlo per unire gli elenchi. Ecco il metodo di estensione si potrebbe fare:
public static IEnumerable<T> PartialMatch<T>(
this Dictionary<string, IEnumerable<T>> dictionary,
string partialKey)
{
// This, or use a RegEx or whatever.
IEnumerable<string> fullMatchingKeys =
dictionary.Keys.Where(currentKey => currentKey.Contains(partialKey));
List<T> returnedValues = new List<T>();
foreach (string currentKey in fullMatchingKeys)
{
returnedValues.AddRange(dictionary[currentKey]);
}
return returnedValues;
}
Edit 2: Vieni a pensarci bene, si potrebbe anche rendere più generico. Con il metodo di estensione successiva, sarebbe lavorare su qualsiasi dizionario, fino a quando si fornisce un comparer
che controllare cosa si intende per "corrispondenza parziale":
public static IEnumerable<TValue> PartialMatch<TKey, TValue>(
this Dictionary<TKey, IEnumerable<TValue>> dictionary,
TKey partialKey,
Func<TKey, TKey, bool> comparer)
{
// This, or use a RegEx or whatever.
IEnumerable<TKey> fullMatchingKeys =
dictionary.Keys.Where(currentKey => comparer(partialKey, currentKey));
List<TValue> returnedValues = new List<TValue>();
foreach (TKey currentKey in fullMatchingKeys)
{
returnedValues.AddRange(dictionary[currentKey]);
}
return returnedValues;
}
Penso che la varietà di risposte qui sotto mostra che le persone stanno assumendo cose diverse per cosa significhi "sottostringa". Presumo dal tuo commento circa 11 che intendi una sottostringa veramente generale che non è necessariamente un prefisso, un suffisso, solo un [anno | mese | giorno], e non è un'espressione regolare? –
@J Trana: hai ragione, intendevo una sottostringa veramente generale. – LeopardSkinPillBoxHat
@LeopardSkinPillBoxHat, potresti pubblicare quale soluzione finale hai seguito? – EndlessSpace