让我用一个真实的例子来解释我的匹配问题(这个问题是通用的)。假设有 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/