Je développe un client de messagerie personnalisé en C#. L'une des exigences évidentes est que je ne télécharge pas les messages déjà téléchargés. Ceci est fait en comparant une chaîne d'identification unique aux messages stockés dans ma base de données.Le moyen le plus efficace de rechercher une chaîne dans une liste de chaînes?
La base de données stocke les e-mails pour plusieurs utilisateurs et plusieurs comptes afin que l'ID unique ne soit pas nécessairement unique dans ma base de données.
Actuellement, j'ai quelque chose comme ceci:
List<String> DownloadedUIDs = BLL.EmailsDataSource.ViewEmailUIDs(AccountNo);
foreach (string uid in serveruids) {
if (DownloadedUIDs.Contains(uid)) continue; // don't download messages we already have
...
}
Je sais que la méthode contains() effectue une recherche linéaire qui est très inefficace. Si 5000 courriels sont stockés sur le serveur, 5000 recherches linéaires doivent être faites sur une liste de 5000 courriels pour déterminer si le courriel existe déjà. Est-ce que je verrais de meilleures performances demandant à SQL Server de commander les ID uniques, puis d'effectuer une recherche binaire ou de stocker les ID uniques dans une table de hachage? Ou en utilisant une autre structure de données?
Quelqu'un connaît-il des comparaisons de performance similaires qui ont été faites?
Je ne comprends pas votre première suggestion - je ne peux pas effectuer la recherche dans la base de données puisque (dans mon exemple au moins) je devrais effectuer la recherche 5000 fois résultant en 5000 appels SQL. – cusimar9
@ cusimar9: Qu'est-ce qui vous empêche de faire la sélection dans une procédure stockée et de passer tous les 5000 ID à cette procédure stockée? Ensuite, tous les sélections s'exécuteraient dans la base de données et vous n'auriez qu'un seul appel à la base de données. –
Je pourrais le faire si c'était le moyen le plus rapide mais je ne pense pas que ce serait – cusimar9