11
votes

Comment utiliser HASHTABLE / HASHSETS IN .NET?

J'ai une liste de 9 000 produits, dont certains peuvent avoir des duplicats.

Je voulais faire une hache de ces produits avec le numéro de série de produits comme clé afin que je puisse trouver des doublons facilement.

Comment allez-vous utiliser une haquetable en C # /. Net? Un hashset serait-il plus approprié?

Finalement, je voudrais une liste comme:

clé-série: 11110 - contient: produit1
Clé-série: 11111 - Contient: produit3, produit6, produit7
Clé-Serial: 11112 - Contient: Produit4
Clé-Serial: 11113 - Contient: Produit8, produit9

Donc, j'ai une liste de tous les produits et ils sont regroupés par ceux qui ont des numéros de série en double. Quel est le moyen "correct" de faire cela?


0 commentaires

6 Réponses :


1
votes

Tout d'abord, vous devez définir votre «clé primaire» telle qu'elle était, un ensemble de champs propres à chaque objet. Je suppose que clé-série code> ferait partie de cet ensemble, mais il doit y avoir d'autres. Une fois que vous définissez cette définition de cette "clé primaire", vous pouvez définir une structure qui représente une valeur de clé code> et utilisez-la comme la touche d'un dictionnaire contenant vos produits.

Exemple: P>

struct ProductPrimaryKey
{
    public string KeySerial;
    public string OtherDiscriminator;

    public ProductPrimaryKey(string keySerial, string otherDiscriminator)
    {
        KeySerial = keySerial;
        OtherDiscriminator = otherDiscriminator;
    }
}

class Product
{
    public string KeySerial { get; set; }
    public string OtherDiscriminator { get; set; }
    public int MoreData { get; set; }
}

class DataLayer
{
    public Dictionary<ProductPrimaryKey, Product> DataSet 
        = new Dictionary<ProductPrimaryKey, Product>();

    public Product GetProduct(string keySerial, string otherDiscriminator)
    {
        return DataSet[new ProductPrimaryKey(keySerial, otherDiscriminator)];
    }
}


0 commentaires

12
votes

Je pense que le dictionnaire est la classe recommandée pour des choses comme ceci.

Ce serait quelque chose comme ceci dans votre cas xxx

(Utilisation de la chaîne de série comme clé) < / p>


2 commentaires

C'est un kludge, comment pouvez-vous choisir le bon produit de la liste? Il n'y a pas de substitut à une clé unique.


Pourquoi est-ce un kludge? La question portait sur le regroupement de produits en série. C'est une réponse simple, simple et lisible qui répond aux exigences, non?



6
votes

Un dictionnaire générique suite à ce meilleur, je pense. Le code pourrait ressembler à quelque chose comme ceci: xxx


0 commentaires

7
votes

Une hache est une sorte de dictionnaire et un hashset est une sorte d'ensemble. Ni des dictionnaires ni définit directement votre problème - vous avez besoin d'une structure de données qui contient plusieurs objets pour une seule touche.

Ces bases de données sont souvent appelées multimaps. Vous pouvez en créer un en utilisant simplement une hache où le type de touches sont des entiers et les types de valeurs sont des ensembles d'une sorte (par exemple, des hashsets ...).

Alternativement, vous pouvez examiner les solutions multi -apes existantes, telles que: multi-in .net .

Pour plus d'informations sur l'utilisation de HASHTables, vous pouvez vérifier sur MSDN: http://msdn.microsoft.com/en-us/library/system.collections.hashable.aspx , et il y a beaucoup d'autres tutoriels - recherchez sur l'utilisation de" Hashtable "ou" Dictionnaire " .


0 commentaires

0
votes

Si vous vouliez simplement avoir une liste de doublons, vous pourriez:

  • prendre créer un dictionnaire de vos entrées de table (appelons-le ienumerable (qui ignore les touches dupliquées) < / li>

  • Créer un hashset du même ienumerable (qui conserve les touches en double, tant que la ligne entière n'est pas la même )

  • puis itérer via dictionary.values ​​, appelant hashset.remove (valeur) pour chaque valeur

    Ce qui reste dans le hashset est les duplicats.


0 commentaires

2
votes

Une excellente option maintenant disponible dans .NET est le Recherche classe. De la documentation MSDN:

Une recherche (Of TKey, TElement) ressemble à un dictionnaire (Of TKey, TValue). La différence est qu'un dictionnaire (de Thkey, Tvalue) plante les clés des valeurs propres, alors qu'une recherche (de tkey, telement) plante les clés des collections de valeurs.

Quelques différences entre une recherche et un dictionnaire (De la liste). À savoir, la recherche est immuable (impossible d'ajouter ou de supprimer des éléments ou des clés après sa création). Selon la manière dont vous envisagez d'utiliser vos données, la recherche peut être avantageuse par rapport à GroupBy () . < / p>


0 commentaires