2016-07-22 306 views
0

我有一個帶有字符串的列表,我想用Levenstein算法(或任何其他)來檢查我試圖插入數據庫的新記錄是否與我已經在數據庫中相似。算法應該通過列表中的每一個項目,並與我想要插入的項目進行比較。如果相似性很高,則打破循環並返回。C#foreach while while循環

我已經開始,但不知道如果我是正確的方式。如何從while循環中的foreach循環中打破?

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

[BREAK](https://msdn.microsoft.com/en-us/library/adbctzc4.aspx)退出循環,[繼續](https://msdn.microsoft.com/en -us/library/923ahwt1.aspx)停留在循環中,但轉到下一次迭代。同時'從while循環中的foreach循環'< - 你想打破'foreach',但繼續'while'或者你想打破兩者(退出方法)?對於後面的'返回true/false',否則只是在'foreach'裏面'break'' – Igor

+0

我不明白你爲什麼需要'while'和'foreach'循環 – juharr

+0

我看不到'similarityProduct'在哪裏使用。什麼是'compareValue'?此代碼混淆不清。 –

回答

0

添加一個額外的變量你而內部指示是否打出來的外環

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

    if (shouldBreak) 
     break; 
} 
3

如何從foreach循環在while循環打破?

不要。通過重構解決問題。假設你要用一個方法替換內部循環。 爲了使外環正確,該方法的輸入和輸出必須是什麼?現在實際上用這些語義編寫一個方法,解決你的問題。

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