最大匹配数。在两个列表中

时间:2013-04-04 03:46:05

标签: c# sql-server list linq-to-sql

存在这样的问题。从数据库中获取一个列表,在程序期间形成第二个列表。 表格如下:

id name
One my foo1 foo2 foo3
2 my fow1 foo2 foo3
...

等等。 在程序操作期间生成的列表从文件中获取数据。 并且是:

id name parent
...

问题在于数据库中表的列父ID号列。 目前,做出了决定:

int countMatch = 0;
foreach (var productse in prod)
{
    var splitted = productse.name.Replace("  ", " ").Split(' ');
    int maxmatch = splitted.Count(s => addProd.name.Contains(s));

    if (maxmatch > countMatch) countMatch = maxmatch;
}

var fixedCount = addProd.name.Split(' ').Count()/1.5;// 1.5 Choose the most best rate
if (countMatch <= fixedCount && prod.All(x => !x.name.ToUpper().Contains(addProd.name.ToUpper())))
  prod.Add(addProd); 

之后将“prod”列表加载到数据库中

此解决方案有效,但效果不是很好。由于某些名称最适合较小,因此无法创建某些记录。

我正在尝试加载的示例数据:

Intel Core i3-2120 3.3GHz 3Mb 2xDDR3-1333 HDGraphics2000 TDP-65w LGA1155 OEM - name created

以下数据获取id id(上面的条目):

Intel Core i3-2120 3.3GHz 3Mb 2xDDR3-1333 HDGraphics2000 TDP-65w LGA1155 OEM
Intel Core i3-2120 3.3GHz 3Mb 2xDDR3-1333 HDGraphics2000 TDP-65w LGA1155 BOX w/cooler
Intel Core i3-2130 3.4GHz 3Mb 2xDDR3-1333 HDGraphics2000 TDP-65w LGA1155 OEM
Intel Core i3-3210 3.2GHz 3Mb 2xDDR3-1333 HDGraphics2500 TDP-55w LGA1155 OEM
Intel Core i3-3225 3.3GHz 3Mb 2xDDR3-1333 HDGraphics4000 TDP-55w LGA1155 OEM
Intel Core i3-3225 3.3GHz 3Mb 2xDDR3-1333 HDGraphics4000 TDP-55w LGA1155 BOX w/cooler
Intel Core i3-3240 3.4GHz 3Mb 2xDDR3-1333 HDGraphics2500 TDP-55w LGA1155 OEM
Intel Core i3-3240 3.4GHz 3Mb 2xDDR3-1333 HDGraphics2500 TDP-55w LGA1155 BOX w/cooler
Intel Core i5-2500K 3.3GHz (TB up to 3.7GHz) 6Mb 2xDDR3-1333 HDGraphics3000 TDP-95w LGA1155 OEM
Intel Core i5-3550 3.3GHz (TB up to 3.7GHz) 6Mb 2xDDR3-1333 HDGraphics2500 TDP-77w LGA1155 OEM
Intel Core i5-3550 3.3GHz (TB up to 3.7GHz) 6Mb 2xDDR3-1333 HDGraphics2500 TDP-77w LGA1155 BOX w/cooler

需要将数据放在表格中,如果数据类似于您获得父级的最大匹配数量。谢谢!

1 个答案:

答案 0 :(得分:0)

你能更清楚地写下你应该做什么吗?据我所知,您希望通过识别最常见的符号将文本文件中的行链接到数据库中的行,其中文本的开头是相同的。如果错了,请纠正我。

首先尝试使用正则表达式,这是文本处理中的国王。 您可以逐行迭代并删除行文本中带空格的最后一个单词。

foreach (var fProduct in fileProducts)
{
    // remove blank spaces >= 2
    var fProductCleared = Regex.Replace(fProduct, @"\s{2,}", "");

    // search best match in data base
    bool isMatched = FunctionToMatchInDB(fProductClear); // search the whole text
    if(!isMatched)
    {
        // remove word by word from the end
        while(fProductClear.Contains(' '))
        {
             // remove last word with space from the end of line
             fProductClear = Regex.Replace(fProductClear,@"\s*[^\s]+\s*$", "");
             bool isMatched = FunctionToMatchInDB(fProductClear); 
             if(!isMatched)
                 break; // TODO: 
        }
    }

}