c# - 实现具有某些限制的 JOIN 的算法

标签 c# mysql linq

让我用一个真实的例子来解释我的匹配问题(这个问题是通用的)。假设有 2 个列表:从不同的源加载“选择”该列表没有重复项。

假设 mkTPL.Selections 和 mkDB.Selections 来自 SQL 表,每个表在 id 和选择名称上都有唯一索引。问题是有时 IdSelectionType 为 null(在 mkTPL.Selections 的选择中)

foreach (var selTPL in mkTPL.Selections)
{   
    foreach (var selDB in mkDB.Selections)
    {
        if (selTPL.IsTheSame(selDB))
            selTPL.OddOrResultValue = selDB.OddOrResultValue;
    }
}

public bool IsStessaSelezione(SelectionPrints selDb)
{ 
    if (selDb.IdSelectionType == this.IdSelectionType)
        return true;
    else
    {
        bool isSameName = selDb.Name == this.Name;

        bool isSimilarName = false;
        if (!isSameName)
        {
            isSimilarName = RegexReplace(selDb.Name, @"\([\d.]+\)") == RegexReplace(this.Name, @"\([\d.]+\)");
        }

        return isSameName || isSimilarName;
    }
}
<小时/>

我实现的匹配算法效率不高。一旦选择匹配,我就不应该尝试将其与其他选择进一步匹配(因为 id 和选择名称上的唯一索引)。

Linq 可以为我提供一个简单的解决方案吗?

最佳答案

首先,当您找到匹配项时,您应该中断:

foreach (var selTPL in mkTPL.Selections)
{   
    foreach (var selDB in mkDB.Selections)
    {
        if (selTPL.IsTheSame(selDB))
        {
            selTPL.OddOrResultValue = selDB.OddOrResultValue;

            break; // <--
        }
    }
}

其次,我会创建一个 mkDB.Selections 字典,在其中存储正则表达式值,这样您就不必在每次迭代时一遍又一遍地进行计算。

类似于:

var mkDBDictionary = mkDB.Selections.ToDictionary(s => RegexReplace(s.Name, @"\([\d.]+\)"), s => s);

foreach (var selTPL in mkTPL.Selections)
{   
    string selTPLName = RegexReplace(selTPL.Name, @"\([\d.]+\)");

    if (mkDBDictionary.TryGetValue(selTPLName, out var selDB))
    {
        selTPL.OddOrResultValue = selDB.OddOrResultValue;
    }
}

关于c# - 实现具有某些限制的 JOIN 的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48418868/

相关文章:

c# - SQL返回列中具有最大值的行,在特定范围内

php - 如何获取每张图片的 Facebook 点赞数量?

mySQL DB 在站点处于事件状态时添加表

mysql - 您是否应该将多个简单查询合并为一个?

c# - LINQ 表达式未被转换为 SQL

c# - 如何根据特定条件对 XML 文件中的值求和

c# - IEnumerator 与 IEnumerator<T>

C# 随机数生成器陷入循环

c# - 如何释放虚拟内存?

c# - LINQ 计数 其中 1 列有两个 int