2010-04-29 8 views
3

J'ai une énorme collection (que je peux lancer comme énumérable en utilisant OfType <>()) d'objets. Chacun de ces objets possède une propriété Category, qui est extraite d'une liste située ailleurs dans l'application. Cette collection peut atteindre des tailles de centaines d'objets, mais il est possible que seulement, disons, 6/30 des catégories possibles soient effectivement utilisées. Quelle est la méthode la plus rapide pour trouver ces 6 catégories? La taille de l'énorme collection me décourage de juste itérer sur l'ensemble de la chose et de renvoyer toutes les valeurs uniques, alors y a-t-il une méthode plus rapide pour accomplir cela?Récupérer rapidement le sous-ensemble de propriétés utilisées dans une énorme collection en C#

Idéalement, je collectionnerais les catégories dans un List<string>.

+2

Combien de centaines? Je classerais une collection en mémoire avec "des centaines" d'articles comme * minuscule *, pas comme * énorme *. Je classerais une collection en mémoire avec, disons, quelques centaines de milliers d'éléments comme * énorme *. –

+0

Je suppose que du point de vue du code, seulement les objets en mémoire eux-mêmes, les plus de 1600 éléments ne sembleraient probablement pas si grands. Mais je suis peut-être un peu intimidé car ils font référence à des fichiers de 1 à 4 Mo chacun, ce qui fait qu'il semble grand sous cet angle. Mais pour référencer la catégorie, je n'ai pas besoin de récupérer le fichier. –

Répondre

2

Si vous utilisez .NET 3.5 puis essayez ceci:

List<string> categories = collection 
    .Cast<Foo>() 
    .Select(foo => foo.Category) 
    .Distinct() 
    .ToList(); 

Il devrait être très rapide.

Je suppose que ces objets provenaient à l'origine d'une base de données? Si oui, vous pouvez demander à la base de données de faire le travail pour vous. S'il y a un index sur cette colonne, vous obtiendrez instantanément le résultat sans avoir à récupérer les objets en mémoire.

+0

La collection de fichiers et la liste des catégories sont stockées dans une base de données, oui. La colonne Catégorie pour les fichiers, cependant, n'est pas indexée, et je ne suis pas autorisé à changer cela pour le moment. Ce LINQ semble devoir faire l'affaire, très probablement. –

0

La taille de l'immense collection me décourage de tout itérer sur la chose entière et retourner toutes les valeurs uniques

J'ai peur afin de trouver toutes les catégories utilisées, vous devrez regarder chaque item une fois, donc vous pouvez difficilement éviter d'itérer (à moins que vous gardiez une trace des catégories utilisées pendant la construction de votre collection). Essayez si la solution Mark Byers est assez rapide pour vous et ne vous préoccupez que de ses performances si ce n'est pas le cas.