2009-11-17 72 views
0

我有一個XML解析並試圖從中提取一些數據。假設解析輸入xml文件後得到的數據集有(2)個表。.NET數據集查詢效率

表#1包含一個IP地址和一個主鍵。 表#2包含端口號和匹配的主鍵。

我想通過這兩個表並生成一個包含IP地址和匹配端口的對象。基本上合併來自共享相同主鍵的兩個表的數據。

現在,我使用嵌套在另一個foreach循環中的foreach循環。外部IP地址通過每個IP地址,內部IP地址通過每個端口並匹配相同的主鍵。

結果有效,但它是O(n^2)。有沒有更快的方法來做到這一點?

順便說一句,我使用C#

回答

1

首先,確保你每DataTablePrimaryKey屬性設置爲相應的列。然後,使用table.Rows.Find(primaryKeyValue)取代第二個DataTable中的相應行,而不是內部循環。在NT和Compact框架中,這將在內部創建和使用索引,爲您提供O(n log n)時間。

要到達O(n),您需要創建一個Dictionary(在內部實現爲hash table)第二個表中的行並對其進行查找。確保您創建的Dictionary的編號爲capacity,在插入過程中不需要調整大小。

+0

首先創建這個「字典」的過程不會至少是O(n)次嗎?然後使用字典是額外的時間。那整個過程如何只是O(n)? – Nick 2009-11-17 04:25:23

+0

無論是哪種情況,您都需要循環建立一個索引 - 對於DataTable,這個循環是在'System.Data'程序集而不是你的代碼中,所以你不會看到它。另外,big-O符號忽略係數O(n)== O(2 * n) - 粗略地說,兩個循環只意味着乘以係數2. http://en.wikipedia.org/wiki/ Big_O_notation – 2009-11-17 05:52:13