C#foreach内部while循环

本文关键字:循环 while 内部 C#foreach | 更新日期: 2023-09-27 17:58:17

我有一个带字符串的列表,我想使用Levenstein算法(或任何其他算法)来检查我试图插入数据库的新记录是否与我在数据库中已经存在的记录相似。算法应该遍历列表中的每一项,并与我想要插入的项进行比较。如果相似度很高,则打破循环并返回。

我已经开始了,但不确定我是否走对了路。如何在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;
    }

C#foreach内部while循环

如何在while循环中打破foreach循环?

不要。通过重构来解决问题。假设您要用一个方法替换内部循环为了使外循环正确,该方法的输入和输出必须是什么现在实际编写一个具有这些语义的方法,您的问题就解决了。

在while中添加一个额外的变量,以指示是否突破外循环

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

很抱歉有问题。以不同的方式看待这个问题。找到了不同的解决方案。

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