2017-06-09 1 views
0

Comment trouver la chaîne la plus proche (s) dans la liste:Comment trouver la chaîne la plus proche dans la liste

var list = new List<string> 
{ 
    "hello how are you", 
    "weather is good today", 
    "what is your name", 
    "what time is it", 
    "what is your favorite color", 
    "hello world", 
    "how much money you got", 
    "where are you", 
    "like you" 
}; 

et si l'entrée mise à jour est la suivante:

string input = "how are you"; 

et un autre avec une erreur de type:

string input = "how are ytou"; 

pour les deux cas serait bon d'obtenir ceci:

hello how are you 
where are you 

ou même ce résultat:

hello how are you 
where are you 
how much money you got 

ou au moins juste:

hello how are you 

J'ai besoin pour éviter une erreur de type minimal dans la requête de l'utilisateur de faire une réponse.

+0

est toujours sur le pourcentage de caractères correspondants dans les mots épanouies sur le séquençage des mots. Peu au-dessus de la capacité de base regex. – sln

+0

@Wiktor Stribiżew édité –

Répondre

0

Une approche simple serait d'utiliser String.Compare pour obtenir le

lexical relationship between the two comparands

Commandez vos articles disponibles après avoir comparé avec l'entrée et de prendre le meilleur match comme

string bestMacht = list.OrderBy(s => string.Compare(s, input)).First(); 

Ceci est seulement la première approche parce que l'ordre des mots devrait être ignoré. Améliorons cela à une solution complète. Après avoir partagé les cordes

string[] splittedInput = input.Split(' '); 

vous êtes en mesure de comparer les mots simples en utilisant un IEqualityComparer. Vous êtes libre de définir combien de caractères il est possible d'échouer chaque mot (dans ce cas 2). Utilisez le comparateur et comparez les mots de l'entrée et de votre dictionnaire. Si deux mots (définis comme requis) correspondent (quel que soit l'ordre), sélectionnez la chaîne.

List<string> matches = list.Where(s => s.Split(' ') 
    .Intersect(splittedInput, new NearMatchComparer()).Count() >= 2) 
    .ToList(); 

Le résultat est une liste de correspondances potentielles.

+0

Bonjour, donc votre sortie avec 'string input =" comment allez-vous ";' est: 'bonjour comment allez-vous, combien d'argent vous avez, où êtes-vous et avec' string input = "comment allez-vous", "seulement " bonjour comment allez-vous ". si j'utilise 'OrderBy' sur le premier résultat, cela équivaut à un résultat propre. On dirait que c'est une bonne façon d'obtenir des résultats pour une telle solution, même si elle n'est pas égale à une sortie qui évite théoriquement un seul mot égal contenant dans la chaîne et fait de même avec une erreur de type dans un mot contenant une combinaison.Comme je ne demande pas de solution directe, je vais le marquer, car ce sont des réponses à l'objectif –