lo haría un método de extensión:
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;
}
}
El "costo" de la adición de los valores al diccionario no cambiaría, pero el costo de la recuperación sería mayor, pero sólo cuando se que estas yendo con una coincidencia parcial.
Btw, estoy seguro de que podría transformar esto en una sola expresión Lambda, pero el concepto sigue siendo el mismo.
Editar: En su ejemplo, este método devolverá 2 listas de valores, pero puede cambiarlo para combinar las listas. Aquí está el método de extensión que podría hacer:
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;
}
Editar 2: Ahora que lo pienso de ella, también podría hacer más genérico. Con el siguiente método de extensión, que funcionaría en cualquier diccionario, siempre y cuando proporcione una comparer
que comprueba lo que entendemos por "coincidencia parcial":
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;
}
Creo que la variedad de respuestas a continuación muestra que las personas están asumiendo cosas diferentes para lo que significa "subcadena". Supongo por su comentario sobre 11 que quiere decir una subcadena realmente general que no es necesariamente un prefijo, sufijo, solo un [año | mes | día], y no es una expresión regular? –
@J Trana - tienes razón, quise decir una subcadena realmente general. – LeopardSkinPillBoxHat
@LeopardSkinPillBoxHat, ¿podría publicar la solución definitiva que aprobó? – EndlessSpace