2016-07-22 139 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; 
    }