Vous devriez vraiment utiliser HashSet<string>
comme la performance de Contains
est nettement mieux. Maintenant, si vous devez utiliser une liste pour d'autres opérations, vous pouvez simplement avoir les deux disponibles.
var list = BuildListOfStrings();
var set = new HashSet<string>(list);
if (set.Contains("Test"))
{
// ...
}
Maintenant vous avez la possibilité de trouver des articles dans l'ensemble comme une opération O(1)
.
test
static void Main(string[] args)
{
var lst = GenerateStrings().Take(5000000).ToList();
var hsh = new HashSet<string>(lst);
var found = false;
var count = 100;
var sw = Stopwatch.StartNew();
for (int i = 0; i < count; i++)
{
hsh = new HashSet<string>(lst);
}
Console.WriteLine(TimeSpan.FromTicks(sw.ElapsedTicks/count));
sw = Stopwatch.StartNew();
for (int i = 0; i < count; i++)
{
found = lst.Contains("12345678");
}
Console.WriteLine(TimeSpan.FromTicks(sw.ElapsedTicks/count));
sw = Stopwatch.StartNew();
for (int i = 0; i < count; i++)
{
found = hsh.Contains("12345678");
}
Console.WriteLine(TimeSpan.FromTicks(sw.ElapsedTicks/count));
Console.WriteLine(found);
Console.ReadLine();
}
private static IEnumerable<string> GenerateStrings()
{
var rnd = new Random();
while (true)
{
yield return rnd.Next().ToString();
}
}
Résultat
0.308438 s
0.0197868 s
0.0 s
Alors qu'est-ce que cela nous dit? Si vous effectuez une petite quantité d'appels à Contains
, utilisez un List<string>
, sinon utilisez un HashSet<string>
.
Obligatoire: Avez-vous testé et mesuré? – ChaosPandion