2013-04-04 169 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: 
     } 
    } 

}