2009-05-21 6 views
1

Je me demande ce que les personnes de Data Structure recommandent de faire comme suit. J'ai une classe qui a trois propriétés principales, par exemple.Structure de données pour l'énumération dans C# où la recherche est souvent basée sur une propriété des objets stockés

public class Example { 

    public Object One { get; } 
    public Object Two { get; } 
    public Object Three { get; } 
} 

Une autre classe contient une collection de ces objets et a souvent besoin d'énumérer sur ces que je fais principalement avec LINQ. La plupart du temps, bien que je doive rechercher/énumérer seulement un sous-ensemble de ces objets basé principalement sur la valeur de la propriété One, ce que je voudrais faire est de les stocker dans une structure de données efficace basée sur cette propriété. Je pouvais faire quelque chose comme ce qui suit:

Dictionary<Object,List<Example>> 

Mais ce qui me frappe comme étant très inefficace, je sais que je besoin d'une sorte de table de hachage, mais ayant jamais utilisé un avant en C# Je ne suis pas sûr de ce qu'il ya à utilisation.

D'autres exigences/notes:

  • Tous les objets sont immuables et ont fixé des codes de hachage qui sont calculées à partir des valeurs de la classe s'instancié avec les constructeurs
  • doivent être en mesure de stocker plusieurs éléments qui ont la même valeur (et donc Hash code) pour la propriété dans un même « créneau horaire » dans la structure de données
  • Doit pouvoir ajouter librement et de supprimer des objets de la collection

Répondre

1

PowerCollections (http://www.codeplex.com/PowerCollections) a un récipient MultiDictionary - vous pourriez peut-être essayer?

+0

J'ai fini par aller avec une classe Hash Table qui fonctionne de manière similaire à MultiDictionary depuis Nous avons joué avec plus de benchmarking et nous avons constaté que cela améliorait significativement les performances de recherche au détriment de la perte de performance de charge mineure – RobV

2

Indexed LINQ peut peut être capable de vous aider ici. Il fournit une collection en mémoire, mais vous permet d'attribuer des propriétés sur vos objets en tant qu'indexables afin qu'il puisse créer des requêtes efficaces contre eux.

+0

semble bon en théorie mais je ne peux pas obtenir mon code pour compiler si je définis [Indexable()] sur les propriétés pertinentes de la classe que je vais stocker – RobV

+0

Semble étrange - quelles erreurs obtenez-vous? –

+0

erreurs de compilation s'avère être qu'ils ont supprimé l'attribut Indexable en faveur de définir IndexSpecifications – RobV

0

ou HybridDictionary

+0

Il serait utile d'inclure un lien vers la documentation MSDN. –

+0

Cela ne satisfait pas vraiment la deuxième exigence de stocker plusieurs éléments dans un seul slot car je vais finir avec un dictionnaire de listes à nouveau – RobV

Questions connexes