Question

Ancienne question

D'après ce que j'ai compris, C # a dans un certain sens des types HashSet et set. Je comprends ce que HashSet<Object> est. Mais pourquoi Set est un mot séparé? Pourquoi chaque ensemble n'est-il pas Dictionary?

Nouvelle question

Pourquoi C # n'a-t-il pas de type générique ISet, similaire au type ICollection? De mon point de vue, j'aimerais avoir un ensemble avec des performances de recherche / addition / suppression standard. Peu m'importe que cela soit réalisé avec des hachages ou autre chose. Alors, pourquoi ne pas créer une classe de set qui serait réellement implémentée en tant que IEnumerable dans cette version de C # mais peut-être quelque peu différente dans une future version?

Ou pourquoi pas au moins l'interface HashedSet?

Répondre

Nous avons appris à remercier toutes les personnes qui ont répondu ci-dessous: <=> implémente beaucoup de ce que vous attendez de <=>. De mon point de vue, cependant, <=> implémente <=> alors que les ensembles ne doivent pas nécessairement être énumérables - exemple: ensemble de nombres réels compris entre 1 et 2 (de plus, les ensembles peuvent être générés de manière dynamique). Je conviens qu'il s'agit d'un discours mineur, car les "programmeurs normaux" ont rarement besoin d'ensembles indénombrables.

Ok, je pense que je comprends. <=> devait absolument s'appeler <=> mais le mot <=> est réservé dans un certain sens. Plus précisément, les créateurs de l'architecture .NET souhaitaient disposer d'un ensemble cohérent (sic!) De classes pour différentes langues. Cela signifie que chaque nom de la classe standard ne doit coïncider avec aucun mot-clé des langages .NET. Cependant, le mot <=> est utilisé dans VB.NET, qui est réellement insensible à la casse (est-ce??). Malheureusement, il n’ya aucune marge de manœuvre.

Mystère résolu:)

Épilogue

La nouvelle réponse de Alex Y. renvoie au Page MSDN décrivant la <=> interface .NET 4.0 à venir, qui se comporte presque comme je le pensais et est implémentée par <=>. Fin heureuse.

Était-ce utile?

La solution

(On a répondu à votre question initiale sur set. IIRC, & "; set &"; est le mot avec les significations les plus différentes en anglais ... évidemment, cela a un impact sur l'informatique aussi.)

Je pense que c'est bien d'avoir HashSet<T> ce nom, mais je serais ravi d'avoir une interface ISet<T>. Étant donné que LinkedHashSet n'est arrivé que dans .NET 3.5 (ce qui en soi était surprenant), je suppose que nous pourrions éventuellement obtenir une collection plus complète de types basés sur des ensembles. En particulier, l’équivalent de ICollection<T> de Java, qui maintient l’ordre d’insertion, serait utile dans certains cas.

Pour être juste, l'interface get couvre en fait la plupart de ce que vous souhaiteriez dans fetch, alors peut-être que ce n'est pas obligatoire. Cependant, vous pourriez faire valoir que l'objectif principal d'un ensemble (qui concerne principalement le confinement et uniquement la possibilité de pouvoir parcourir itérativement les éléments) n'est pas tout à fait identique à celui d'une collection. C'est délicat. En fait, un ensemble véritablement mathématique peut ne pas être itérable ou dénombrable - par exemple, vous pourriez avoir & "; L'ensemble des nombres réels compris entre 1 et 2. &"; Si vous aviez un type numérique à précision arbitraire, le nombre serait infini et itérer dessus n'aurait aucun sens.

De même l'idée de & ajouter "&"; à un ensemble n'a pas toujours de sens. La mutabilité est une affaire délicate lorsque vous nommez des collections: (

EDIT: OK, en réponse au commentaire: le mot clé assign n'est en aucun cas un héritage à faire avec Visual Basic. C'est l'opération qui définit la valeur d'une propriété, par rapport à <=> laquelle récupère l'opération. Cela n’a rien à voir avec l’idée d’un ensemble en tant qu’opération.

Imaginez qu'au lieu de cela, les mots clés soient <=> et <=>, par exemple

.
// Not real code!
public int Foo
{
    fetch
    {
        return fooField;
    } 
    assign
    {
        fooField = value;
    } 
}

Le but est-il clair ici? Maintenant, l'équivalent réel de celui en C # est juste

public int Foo
{
    get
    {
        return fooField;
    } 
    set
    {
        fooField = value;
    } 
}

Donc si vous écrivez:

x = y.Foo;

qui utilisera la <=> partie de la propriété. Si vous écrivez:

y.Foo = x;

qui utilisera la <=> partie.

Est-ce plus clair?

Autres conseils

Il n'y a pas de set <T>. Ce Article de blog de l'équipe BCL a beaucoup de détails sur HashSet, y compris une discussion pas tout à fait concluante sur l’inclusion du hachage dans le nom. Je suppose que tous les membres de l'équipe de la BCL n'ont pas aimé la décision d'utiliser le nom HashSet <=>.

La seule raison à cela semble être le manque de ressources pour l'implémenter idéalement dans .NET 3.5.

.NET 4.0 inclura ISet , ainsi que sa nouvelle implémentation en plus de HashSet - SortedSet . Consultez les liens fournis vers la bibliothèque MSDN. Ils sont déjà disponibles dans .NET 4.0 beta1.

set est un mot clé du langage C # utilisé depuis la version 1.0. Is est utilisé pour définir la partie d'attribution de valeur d'une propriété (et get est utilisé pour implémenter la partie de lecture de valeur d'une propriété). Dans ce contexte, vous devez comprendre le mot "définir" comme un verbe, comme pour définir une valeur.

HashSet<T> est une implémentation particulière du concept mathématique d'un ensemble. Il a été introduit pour la première fois dans .NET 3.5. Ce billet de blog de l'équipe BCL explique plus en détail le raisonnement qui le sous-tend, ainsi que quelques indices expliquant pourquoi le nom est Set<T> et pas seulement <=>: http://blogs.msdn.com/bclteam/archive/2006/11/09/introducing -hashset-t-kim-hamilton.aspx .

Dans le cas de <=>, vous devez comprendre le mot "set" comme un nom.

Set est un mot clé réservé dans VB.NET (c'est l'équivalent d'un set en C #). VB.NET peut utiliser des classes / méthodes / etc avec le même nom en tant que mots-clés, mais ils doivent être écrits entre crochets, ce qui est moche:

Imports Wintellect.PowerCollections 'PowerCollections contains a class called Set'
Public Class Test
    Private _myValue As Integer  

    Public Property MyValue() As Integer
        Get
            Return _myValue
        End Get
        Set ' Set as keyword'
            _myValue = value
        End Set
    End Property

    Public Function X As [Set](Of Integer)
        Dim a As New [Set](Of Integer) ' Set as class'
        Return a
    End Function

End Class

Ah oui, je comprends maintenant votre question.
Pas sûr que je puisse à 100% voir la nécessité d'un ISet<T>.
Je suppose que la question est de savoir quel est le comportement essentiel pour un ensemble. Selon vous. S'agit-il de Ajouter, Supprimer, Contient, etc. Si oui, ICollection<T> fournit déjà une interface pour cela.
S'il s'agit d'opérations définies telles que Union, Intersect, etc., est-ce que c'est quelque chose que vous jugeriez suffisamment générique pour résumer une application de type contrat?

Je dois dire que je ne connais pas la bonne réponse à cette question. Je pense que cela peut faire l'objet d'un débat et je pense que l'équipe de la BCL pourrait finir par proposer quelque chose de ce genre dans une version future, mais c'est à eux de décider. Personnellement, je ne vois pas cela comme une énorme pièce manquante de fonctionnalité

Message d'origine

La BCL n’a pas du tout de collection Set, du moins pas autant que je sache.
Quelques bibliothèques tierces, telles que Iesi.Collections
HashSet<T> a été introduit dans .NET 3.5 pour créer une collection d’ensembles rapides, c’est-à-dire où vous souhaitez une collection sans doublons. Il comporte également des opérations sur les ensembles typiques telles que Union et Join. Consultez ce lien de l'équipe BCL sur HashSet

Vous l'utiliseriez généralement là où vous deviez auparavant utiliser List<T> et vérifier s'il y avait des doublons lors de l'ajout.
L'ajout d'éléments à un <=> peut également être nettement plus rapide que la Liste

.

Quelques détails supplémentaires:
Une autre fonctionnalité intéressante de HashSet est qu’il ne lève pas d’exception si vous essayez d’ajouter un doublon, il ne réussit pas à ajouter l’entrée dupliquée, ce qui vous évite d’avoir à mettre beaucoup de blocs try.catch autour de chaque ajout - bien:)

Je suis presque sûr qu'il n'y a pas de classe Set<T> dans la BCL, du moins dans .NET 3.5 (et non .NET 4.0 non plus, semble-t-il). Qu'attendriez-vous de toute façon d'un tel cours?

HashSet<T> est en soi une structure de données d'ensemble ordinaire qui utilise des codes de hachage (la méthode GetHashCode d'un objet) pour comparer des éléments. C'est simplement un moyen efficace d'implémenter un type de set. (Les autres méthodes de vérification de l’égalité auraient probablement des performances inférieures.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top