2016-07-22 1 views
0

J'ai une liste avec des chaînes, je veux utiliser l'algorithme de Levenstein (ou tout autre) pour vérifier si le nouvel enregistrement que j'essaie d'insérer dans une base de données est similaire à ce que j'ai déjà dans la base de données . L'algorithme devrait aller à travers chaque élément de la liste et comparer avec celui que je veux insérer. Si la similarité est élevée, alors cassez la boucle et retournez.C# foreach inside while loop

J'ai commencé, mais je ne sais pas si je suis sur la bonne voie. Comment rompre avec foreach boucle en boucle?

public static bool IsSimilarValuesExist(string value) 
    { 
     bool result = false; 
     string valueFromList = string.Empty; 
     double similarityProduct = 0; 

     List<string> products = ServicesMail.GetProducts(); 

     IStringMetric metric = new Levenstein(); 
     while (metric.GetSimilarity(value, valueFromList) < 5) 
     { 
      foreach (var item in products) 
      { 
       // If current item not similar, continue 
       // If is similar, break from loop and assign current compareValue to similarityProduct 
      } 
     } 

     return result; 
    } 
+0

[rupture] (https://msdn.microsoft.com/en-us/library/adbctzc4.aspx) pour sortir de la boucle, [continue] (https://msdn.microsoft.com/en -us/library/923ahwt1.aspx) pour rester dans la boucle mais passer à l'itération suivante. Aussi 'de foreach loop in while loop' <- vous voulez sortir de' foreach' mais continuer dans 'while' ou vous voulez sortir des deux (quitter la méthode)? Pour le 'return true/false' plus tard, sinon juste' break' dans le 'foreach' – Igor

+0

Je ne vois pas pourquoi vous avez besoin d'une boucle' while' et 'foreach' – juharr

+0

Je ne vois pas où' similarityProduct' est utilisé . Qu'est-ce que 'compareValue'? Ce code est incomplètement source de confusion. –

Répondre

0

ajouter une variable supplémentaire à l'intérieur de votre temps pour indiquer si vous voulez sortir de la boucle extérieure

while(...) 
{ 
    bool shouldBreak = false 
    foreach(...) 
    { 
     shouldBreak = true; 
     break; 
    } 

    if (shouldBreak) 
     break; 
} 
3

Comment briser de la boucle foreach en boucle while?

Do not. Résoudre le problème en refactoring. Supposons que vous deviez remplacer la boucle interne par une méthode. Quelles devraient être les entrées et les sorties de cette méthode pour que la boucle externe soit correcte? Maintenant, écrivez réellement une méthode avec ces sémantiques, et votre problème est résolu.

0

Désolé pour une question. J'ai regardé le problème différemment. Trouvé une solution différente.

 public static bool IsSimilarValuesExist(string value) 
    { 
     var result = false; 

     double productSimilarity = 0; 
     double publisherSimilarity = 0; 

     List<string> products = FilterListWithFirstOrSecondCharacter(value, ServicesMail.GetAllProductNames()); 
     List<string> publishers = FilterListWithFirstOrSecondCharacter(value, ServicesMail.GetAllPublisherNames()); 

     IStringMetric metric = new Levenstein(); 

     foreach (var item in products) 
     { 
      if (metric.GetSimilarity(value, item) * 100 > 80) 
      { 
       productSimilarity = metric.GetSimilarity(value, item) * 100; 
      } 
     } 

     foreach (var item in publishers) 
     { 
      if (metric.GetSimilarity(value, item) * 100 > 80) 
      { 
       publisherSimilarity = metric.GetSimilarity(value, item) * 100; 
      } 
     } 

     var averageSimilarity = productSimilarity * publisherSimilarity/2; 
     if (averageSimilarity >= 80) 
     { 
      result = true; 
     } 

     return result; 
    }