2016-07-22 9 views
0

私は文字列のリストを持っていますが、私はデータベースに挿入しようとしている新しいレコードが既にデータベースにあるものと似ているかどうかを確認するためにLevensteinアルゴリズム(または他の方法) 。アルゴリズムは、リスト内のすべての単一項目を通過し、挿入したいものと比較する必要があります。類似性が高い場合は、ループを解除して戻ります。C#foreach inside 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

ループを終了し、[ブレーク](https://msdn.microsoft.com/en-us/library/adbctzc4.aspx)は、(https://msdn.microsoft.com/en [続行] -us/library/923ahwt1.aspx)を使用してループに留まりますが、次の反復に移動します。また、 'foreach loop in whileループ' < - foreachから抜け出したいが、 'while'で続けるか、両方から抜け出したい(メソッドを終了する)?後で 'true/falseを返します'、 'foreach'の中で' break'を返します – Igor

+0

なぜ 'while'ループと' foreach'ループが必要なのかわかりません – juharr

+0

'similarityProduct'がどこに使われているのかわかりません。 'compareValue'とは何ですか?このコードは紛らわしく不完全です。 –

答えて

0

whileループでforeachループから分割する方法外側のループの外に

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

    if (shouldBreak) 
     break; 
} 
3

を破るかどうかを示すために、あなたの中の内側に余分な変数を追加しますか?

Do not。リファクタリングで問題を解決します。内部ループをメソッドに置き換えるとします。 外側のループを正しくするためには、そのメソッドの入力と出力はどうでしょうか?これらのセマンティクスでメソッドを実際に記述すると、問題は解決されます。

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