2016-07-22 2 views
0

У меня есть список со строками, я хочу использовать алгоритм Левенштейна (или любой другой), чтобы проверить, что новая запись, которую я пытаюсь вставить в базу данных, похожа на то, что у меня уже есть в базе данных , Алгоритм должен проходить через каждый элемент в списке и сравнивать с тем, который я хочу вставить. Если подобие высокое, то разрыв цикла и возврат.C# foreach внутри while loop

Я начал, но не уверен, если я на правильном пути. Как прорваться из цикла foreach в цикле while?

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

[перерыв] (https://msdn.microsoft.com/en-us/library/adbctzc4.aspx) для выхода из цикла, [продолжить] (https://msdn.microsoft.com/en -us/library/923ahwt1.aspx), чтобы оставаться в цикле, но переходите к следующей итерации. Также 'from foreach loop in while loop' <- вы хотите вырваться из' foreach', но продолжать в 'while' или вы хотите выйти из обоих (выйти из метода)? Для более позднего 'return true/false', иначе просто' break' внутри 'foreach' – Igor

+0

Я не понимаю, почему вам нужен цикл' while' и 'foreach' – juharr

+0

Я не вижу, где используется' similarityProduct' , Что такое 'compareValue'? Этот код путается неполным. –

ответ

0

добавить дополнительную переменную внутри некоторое время, чтобы указать, следует ли выйти из внешнего контура

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

    if (shouldBreak) 
     break; 
} 
3

Как выйти из цикла Еогеасп в то время как цикл?

Нельзя. Решите проблему путем рефакторинга. Предположим, вы должны заменить внутренний цикл на метод. Каковы были бы входы и выходы этого метода, чтобы сделать внешний контур правильным? Теперь на самом деле напишите метод с семантикой, и ваша проблема решена.

0

Извините. Посмотрел на проблему по-разному. Нашел другое решение.

 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; 
    }