Est-il possible de faire une correspondance de chaîne partielle sur une clé de chaîne de dictionnaire?
J'ai un Dictionary<string, List<int>>
dans mon code j'utilise de la manière suivante:
Key Values
2011-07-15 1, 2, 3
2011-07-20 4, 5, 6
2010-02-11 7, 8, 9
Mon code doit être capable de faire une requête pour toutes les valeurs correspondant à une sous-chaîne particulière dans la clé. Par exemple, si j'avais les sous-chaîne 2011-07
il devrait retourner les valeurs {1, 2, 3, 4, 5, 6}
. Une sous-chaîne de 11
devez retourner tous les Id de 1-9
.
Peut-on recommander une manière concise pour y parvenir? Ou de fournir une meilleure structure de données pour la récupération de cette information?
source d'informationauteur LeopardSkinPillBoxHat
Vous devez vous connecter pour publier un commentaire.
Je voudrais faire une extension de la méthode :
Le "coût" de l'ajout de valeurs pour le dictionnaire ne change pas, mais le coût de la récupération serait plus élevé, mais uniquement lorsque vous savez que vous allez avec une correspondance partielle.
Btw, je suis sûr que vous pourriez transformer cela en une seule expression Lambda, mais le concept reste le même.
Modifier: Dans votre exemple, cette méthode serait de retour de 2 listes de valeurs, mais vous pouvez le changer pour fusionner les listes. Voici la méthode d'extension que vous pouvez faire :
Edit 2: Venez pour penser à elle, vous pourriez aussi vous rendre plus générique. Avec la prochaine extension de la méthode, elle fonctionne sur n'importe quel dictionnaire, aussi longtemps que vous fournissez un
comparer
que vérifier ce que vous entendez par "correspondance partielle" :Vous êtes à la recherche pour des réponses concises. Sans fantaisie indexation à un faible niveau pour le texte (dont je ne sais pas du tout spécialisé .Net classes), je pense que le dictionnaire est toujours votre meilleur pari. Requête avec quelque chose comme:
myDictionary.Where(kvp => kvp.Key.Contains("11")).SelectMany(kvp => kvp.Value);
Vous avez à la recherche par le biais de toutes les clés pour une généralisé sous-chaîne de toute façon sans assez cool magie (non fournies par l' .Net), donc LINQ ne devrait pas vous blesser beaucoup ici.
Si le Dictionnaire utilise en interne de tables de hachage, vous êtes hors de la chance, comme des chaînes similaires rendement dissemblables les tables de hachage. Je viens de solution mise en œuvre de cette exigence sur le week-end en C, une interview de test/devoirs à la maison. J'ai utilisé un tableau trié que la structure sous-jacente - cher insère, mais rapide des recherches (à l'aide de la recherche binaire). Pour trouver toutes les entrées avec clé de démarrage avec un préfixe, je trouverais le 1er, alors allez simplement à côté, à côté... Pour le général, sous-chaîne, c'est à dire non seulement préfixe, ma solution ne fonctionnerait pas. En ce moment, je ne sais pas quoi proposer pour le "général de la sous-chaîne" de recherche.
Vous pouvez avoir trois dictionnaires. Année, Mois, Jour.
Notez que lorsque vous ajoutez des éléments à trois dictionnaires, vous n'êtes PAS dupliquer les objets.
Lorsque vous tirez sur des éléments à l'aide de deux touches, vous pouvez utiliser l'Extension LINQ méthode Intersect() pour obtenir les éléments qui correspondent à deux touches (Utilisation se Croisent sur les deux ensembles de résultats).
Mise en garde, le faisant de cette manière ne serait pas plus rapide à l'exécution de code.
Une manière concise serait d'utiliser les valeurs multiples de la Carte.
Par exemple:
pourquoi ne pas stocker le 2011-07 comme l'un des principaux et 15 pour l'intérieur clé de dictionnaire et 1,2,3 en tant que valeurs.
carte["2011-07"]["15"]= {1,2,3};
si vous voulez juste
2011-07
vous pouvez obtenir tout dans l'autre dictionnaire par traversée.map["2011-07"]
//retour u 1,2,3,4,5,6et si vous voulez aller à un jour spécifique,
2011-07-15
ce serait de retour u ne 1,2,3si vous aurez besoin de année/mois/jour, vous aurez besoin de plusieurs niveaux de dictionnaires. ou vous pouvez utiliser un Arbre.