2013-04-04 128 views
0

存在这样的问题。有一个从数据库中取得的清单,在程序中有第二个清单。 表如下:最大匹配数。在两个列表

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

说,“刺”列表加载到数据库

此解决方案之后,但不是很好。由于某些名称最适合较小,因此不会创建一些记录。

,我试图给负载

的样本数据:

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

得到以下数据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 

需要把数据表,并如果数据类似于您获得父项的最大匹配数。谢谢!

回答

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

}