我處理2個數據表:C#值2點的DataTable
- SSFE:包含的價值觀,我想找到
- FFE:是大於,小於或同樣大SSFE,但不一定包含SSFE的每個值
我需要在這些表之間匹配的值是整數,兩個表都按從小到大排序。 我的想法是開始搜索FFE的第一個項目,開始循環SSFE,當我找到一個匹配 - >記住當前索引 - >保存匹配 - >從FFE選擇下一個項目並繼續從上一個索引。
此外,FFE可以包含整數,但也可以包含字符串,這就是爲什麼我將值轉換爲字符串並進行比較的原因。
我做了一些代碼,但它需要太多的時間。 將SSFE(1.000項)與FFE(127.000)項目進行比較需要大約一分鐘的時間。
int whereami = 0;
bool firstiteration = true;
for (int i = 0; i < FFEData.Rows.Count - 1; i++)
{
for (int j = 0; j < SSFEData.Rows.Count - 1; j++)
{
if (firstiteration)
{
j = whereami;
firstiteration = false;
}
if (SSFEData.Rows[j][0] == FFEData.Rows[i][0].ToString())
{
found++;
whereami = j;
firstiteration = true;
break;
}
}
}
我只存儲了多少次我發現用於測試的事件。在這個例子中,它會找到490個匹配,而不是這是相關的。
任何建議將是偉大的!
[codereview.se]可能會比這個問題更像SO。也就是說,像'ToString'這樣的東西讓我覺得效率低下,'where'變量也不清楚它應該做什麼,但我敢打賭,'firstiteration'測試可以通過一些邏輯變化來消除。 – paqogomez
另外,我發現數據表非常慢。如果將這些數據填充到自己的對象中,則可以使用linq將它們連接在一起並找到匹配項。這不會是一個加速,但它會讓你的代碼更具可讀性。 – paqogomez
@paqogomez在這種情況下,這是一個局部變量,用於存儲當前索引'j'。數據實際上是填充在我自己的對象中的,通過Linq加入這兩個表不是一個選項。因爲應用程序必須儘可能短,這是因爲它運行在非常重要的生產服務器上,這些服務器沒有足夠的內存用於複雜和長時間運行的任務。目前使用大約200MB的RAM,當執行這個Linq程序時,它將會建立到約600MB,這太多了。 –