我正在用C#開發一個自定義電子郵件客戶端。其中一個明顯的要求是我不下載已經下載的消息。這是通過比較一個唯一的ID字符串和存儲在我的數據庫中的消息來完成的在字符串列表中搜索字符串的最有效方法?
數據庫存儲多個用戶和多個帳戶,以獨特的ID不一定會在我的數據庫中是唯一的電子郵件。
目前,我有這樣的事情:
List<String> DownloadedUIDs = BLL.EmailsDataSource.ViewEmailUIDs(AccountNo);
foreach (string uid in serveruids) {
if (DownloadedUIDs.Contains(uid)) continue; // don't download messages we already have
...
}
我知道contains()方法執行線性搜索,這是非常低效的。如果服務器上存儲有5000封電子郵件,則需要在5000封電子郵件列表中進行5000個線性搜索,以確定電子郵件是否已存在。
我會看到更好的性能要求的SQL Server訂購的唯一ID,然後執行二進制搜索它們,或者存儲在哈希表中的唯一ID?或者使用其他一些數據結構?
有誰知道已作出任何類似的性能比較?
我不明白你的第一個建議 - 我無法在數據庫中執行搜索,因爲(至少在我的例子中),我將不得不執行搜索5000次,導致5000次SQL調用。 – cusimar9 2011-04-07 08:47:50
@ cusimar9:什麼阻止您在存儲過程中執行選擇並將所有5000個ID傳遞到該存儲過程?然後所有選擇都將在數據庫中運行,並且只有一個對數據庫的調用。 – 2011-04-07 08:50:20
如果這是最快的方法,我可以這樣做,但我不認爲它會是 – cusimar9 2011-04-07 08:55:03