2013-03-05 19 views
1

我有2個DataTables:TableNumber包含移動號碼和TableCode,它包含所有可能的移動代碼的混合,所有可能的移動代碼都是6位數字。我想創建一個列表,只有它的6個第一個數字來自TableCode的數字,因此不會考慮其第一個數字不在TableCode中的任何數字。我已經用foreach,.Contains(),IndexOf(),但都是慢的,因爲在數字中的記錄超過100,000,並且循環所有項目需要很長的時間。並與另一個表進行比較。我使用了2個嵌套的foreach循環。我做了一些愚蠢的事情,我認爲有2 foreach,因爲這將是30億搜索TableCode的30,000名成員,它需要我5分鐘給我結果。我的代碼是這樣的:將Datatable與另一個比較,看它是否有正確的格式

foreach(string codetable in TableCode) 
    { 
      foreach(string grouptable in TableNumber) 
       { 
        if(grouptable.IndexOf(codetable)!=-1) 
        { 
         //work here 
        } 
       } 
    } 

在這裏,我已經添加表的行數僅含有數字,所以我在這裏搜索列表,但類似這樣的嘗試比較數據表時再花費太長的名單。

+0

_「已經用foreach試過,。載有()的IndexOf(),但都是慢...我用2嵌套的foreach循環。我正在做一些愚蠢的事情,我認爲有2 foreach,因爲這將是30億次搜索......「_只是顯示你已經嘗試過,這是很難理解的問題 – 2013-03-05 08:49:26

+0

我很努力地看到你的嘗試以實現,也許重新解釋這個問題!?! – Derek 2013-03-05 08:51:20

+0

_「我想創建一個列表,只有其數字的第一個數字是從TableCode」_ _那麼,爲什麼你不只是從'DataTable'中的所有數字, TableCode only? – 2013-03-05 08:51:29

回答

1

所以TableNumber是你想用來過濾TableCode-DataTable的「正面」表格。

所以模型類似於此:

var TableNumber = new DataTable(); 
var TableCode = new DataTable(); 
TableNumber.Columns.Add("MobileNumbers", typeof(string)); 
TableCode.Columns.Add("MobileCode", typeof(string)); 

然後你可以使用一個HashSet<string>所有有效的數字和Enumerable.Join到行中第二個表與有效的數字鏈接:

var numbersFirst6digits = TableNumber.AsEnumerable() 
    .Select(r => new string(r.Field<string>("MobileNumbers").Where(Char.IsDigit).Take(6).ToArray())); 
var dictionary = new HashSet<string>(numbersFirst6digits); 

var validCodeRows = from row in TableCode.AsEnumerable() 
        join num in dictionary 
        on row.Field<string>("MobileCode") equals num 
        select row; 
// if you need a new DataTable: 
DataTable tblValidCodes = validCodeRows.CopyToDataTable(); 

如果您不需要過濾前6位數字的第一個表格,則可以替換此行:

.Select(r => new string(r.Field<string>("MobileNumbers").Where(Char.IsDigit).Take(6).ToArray())); 

.Select(r => {var mNum = r.Field<string>("MobileNumbers"); return mNum.Length < 6 ? mNum : mNum.Substring(0, 6)};); 
+0

可以請你看看編輯的問題?我做了這些,但都花了很長時間,我不知道爲什麼,也許記錄太多了,我應該使用幾個線程來加速這個? – 2013-03-06 11:32:01

+0

@HosseinAmini:回滾到您的問題的最後一個版本,因爲你有[問另一個問題](http://stackoverflow.com/questions/15246490/fast-way-of-extraction-of-a-list-based-on -another-list)以滿足您的新需求。 – 2013-03-06 13:19:07

3

也許數據錶轉換爲IEnumerable的按照以下:Convert DataTable to IEnumerable<T>

那麼也許使用收益回報和也許處理在單獨的線程的處理,甚至使用LINQ用於過濾。

也許在表上執行一些排序並將它們拆分爲更小的塊,併爲並行處理產生更多的線程。

+0

LINQ是方式+1 – 2013-03-05 09:37:10

相關問題