À l'aide d'une Liste, de Recherche ou de Dictionnaire pour une grande liste de données
J'ai une classe statique dans ma Bibliothèque de Classe appelé de Recherche, j'utilise cette classe pour rechercher des valeurs différentes (dans ce cas, les Emplacements).
Ces valeurs peuvent être au nombre de plusieurs centaines. Étant donné que 95% de mes clients d'installer mon application sur un ordinateur sans Internet, je suppose que mon applications n'auront pas accès à internet ou de l'accès à une base de données.
Donc je veux savoir si c'est un moyen efficace de ce traitement et si je suis en disposer correctement de l'objet lorsque la méthode est fait:
CODE :
using System;
using System.Collections.Generic;
namespace FunctionLibrary
{
public static class Lookups
{
private static List<Vers> Versions;
public static string GetVersion(string s)
{
string retValue = string.Empty;
Versions = new List<Vers>();
try
{
if (s.Trim().Length > 0)
{
GetVersions();
retValue = Versions.Find(ver => ver.VersionNumber == s).VersionLiteral;
if (string.IsNullOrEmpty(retValue))
{
retValue = string.Format("{0} is an Unknown Version Number", s);
}
}
else
{
retValue = "No version number supplied";
}
}
catch
{
retValue = string.Format("{0} is an Unknown Version Number", s);
}
finally
{
Versions.Clear();
Versions = null;
}
return retValue;
}
private static void GetVersions()
{
Versions.Add(new Vers() { VersionNumber = "0000", VersionLiteral = "Location 1" });
Versions.Add(new Vers() { VersionNumber = "0001", VersionLiteral = "Location 2" });
Versions.Add(new Vers() { VersionNumber = "0002", VersionLiteral = "Location 3"});
Versions.Add(new Vers() { VersionNumber = "0003", VersionLiteral = "Location 4"});
Versions.Add(new Vers() { VersionNumber = "0004", VersionLiteral = "Location 5"});
Versions.Add(new Vers() { VersionNumber = "0005", VersionLiteral = "Location 6"});
Versions.Add(new Vers() { VersionNumber = "0006", VersionLiteral = "Location 7"});
Versions.Add(new Vers() { VersionNumber = "0007", VersionLiteral = "Location 8"});
}
}
public class Vers
{
public string VersionLiteral { get; set; }
public string VersionNumber { get; set; }
}
}
Je suis également demandais si je devrais utiliser un Dictionnaire ou une Recherche au lieu de la liste. Je ne veux pas de multiples appels à cette méthode pour provoquer des problèmes de mémoire.
- L'utilisation de générique list<T>, où T est votre classe personnalisée me semble très bien - un moyen approprié de l'aide.
- Ce ne semble pas être tout à fait inefficace façon de gérer cela. Je n'hésiterais pas à utiliser un dictionnaire, et au lieu de remplir la Liste des Versions (dictionnaire) chaque fois que vous effectuez un appel à GetVersion, seul le remplissage de la première fois (en vérifiant si la Liste des Versions/Dictionnaire est nulle; si c'est => le remplir, sinon lire). Comme je n'ai pas accès à VS (et je n'ai pas utilisé le C# pour un certain temps, donc je ne pense que je peux le faire sans la complétion de code), je ne peux pas vous donner un exemple, je pense qu'il devrait être assez facile, mais... Edit: voir eyossi de la réponse 🙂
Vous devez vous connecter pour publier un commentaire.
Pour une évaluation plus approfondie, vous pourriez envisager de codereview.SE.
Quelques remarques générales sur
List<T>
vsDictionnaire<TKey, TValue>
vsRecherche<TKey, TElement>
Comme d'autres réponses ont montré, à l'aide d'une Liste est terrible dans votre scénario, principalement parce que la recherche des éléments auront la mauvaise performance.
Le choix entre
Dictionary
etLookup
n'est pas difficile (à partir de MSDN, c'est moi qui souligne):Puisque vous aurez seulement besoin de la carte des clés à des valeurs uniques, un
Dictionary
est le bon choix.La auparavant accepté de répondre à est un pas dans la bonne direction, mais obtient toujours plusieurs choses mal (edit: ces problèmes ont été résolu).
Les chaînes sont immuables:
s.Trim()
ne changera pass
— il sera de retour une nouvellestring
ce qui signifie que vous devezs = s.Trim()
si vous utilisez les
après, ce qui vous sont.Une classe statique ne peut pas avoir une instance constructeur:
public Lookups()
devrait êtrestatic Lookups()
(constructeurs statiques ne sont pas autorisés à avoir des modificateurs d'accès de cours).Ne pas renvoie une chaîne vide /un message d'erreur comme un chaîne!
Qui va finir comme un merveilleux débogage des maux de tête. Vous devriez être en utilisant Exceptions au lieu de passer des chaînes d'erreur autour de — et vous devriez fournir un
VersionExists
méthode pour vérifier si votre dictionnaire contient une certaine version!Modifié, plus sûrs exemple
Cela permettra de jeter un
FormatException
si le paramètre est vide, la valeur null ou un espace. Dans le cas où la version n'existe pas, leDictionary
va jeter unKeyNotFoundException
— un peu plus utile pour le débogage destring.Empty
, vous ne pensez pas?essayer ça:
}
Par ce que vous obtenez:
GetVersion
méthodeL'aide de la Liste dans cette situation conduit à une ÉNORME inefficacité. Votre demande va être ridiculement lent dans ce cas.
De recherche de Dictionnaire aidera BEAUCOUP.
La différence entre eux est que de Recherche vous permet d'avoir plus d'une valeur pour une clé donnée lors du Dictionnaire n'accepte qu'une seule.
Alors, si dans votre cas VersionNumber est unique, alors l'utilisation du Dictionnaire utiliser autrement de Recherche.
Vous pouvez simplement transformer votre liste dans un Dictionnaire ou une Recherche une fois:
Si vous le faites une fois (peut-être quand votre application est en cours de chargement) et ensuite l'utiliser partout:
Encore une fois, si vous avez besoin de Recherche, puis remplacer ToDictionary avec ToLookup 😉