Frage

Alte Frage

Mein Verständnis ist, dass C # in gewissem Sinn HashSet und set Typen hat. Ich verstehe, was HashSet ist. Aber warum ist set ein separates Wort? Warum nicht jeder Satz HashSet<Object> wird?

Neue Frage

Warum C # keine Generika Set Typ hat, ähnlich Typ Dictionary? Aus meiner Sicht würde Ich mag einen Satz mit Standard-Lookup / Hinzufügen / Löschen Leistung haben. Ich würde nicht viel egal, ob es mit Hashes oder etwas anderes realisiert wird. Warum also nicht einen Satz Klasse machen, die tatsächlich als HashSet in dieser Version von C # implementiert werden würde, aber vielleicht etwas anders in einer zukünftigen Version?

Oder warum nicht zumindest Schnittstelle ISet?

Antwort

Learned Dank an alle, die unten beantwortet: ICollection implementiert eine Menge von dem, was Sie von ISet erwarten würde. Aus meiner Sicht, aber ICollection implementiert IEnumerable während Sätze --- Beispiel nicht zählbare sein müssen: Menge der reellen Zahlen zwischen 1 und 2 (sogar mehr, können Sets dynamisch generiert werden). Ich bin damit einverstanden dies eine kleine Tirade ist, als "normale Programmierer selten benötigen unzählige Sets.

Ok, ich glaube, ich verstehe. HashSet war absolut gemeint Set genannt werden, aber das Wort Set ist in gewissem Sinne vorbehalten. Insbesondere wollte Schöpfer von .NET-Architektur einen einheitlichen Satz (sic!) Von Klassen für verschiedene Sprachen haben. Das bedeutet, dass jeder Name der Standardklasse nicht mit einem Schlüsselwort in den .NET-Sprachen übereinstimmen. Das Wort Set jedoch in VB.NET verwendet wird, die eigentlich Groß- und Kleinschreibung ist (ist es?), So leider gibt es keinen Raum für Manöver gibt.

Rätsel gelöst:)

Epilog

Die neue Antwort von Alex Y. Links zu dem MSDN-Seite , die die bevorstehende .NET 4.0-Schnittstelle beschreibt ISet , die so ziemlich verhält, wie ich dachte, es sollte und wird von HashedSet umgesetzt. Glückliches Ende.

War es hilfreich?

Lösung

(Ihre ursprüngliche Frage zu set beantwortet wurde. IIRC, „set“ ist das Wort, mit den unterschiedlichsten Bedeutungen in der englischen Sprache ... offensichtlich diese Auswirkungen hat auch bei der Berechnung.)

Ich denke, es ist in Ordnung HashSet<T> mit diesem Namen zu haben, aber ich würde auf jeden Fall begrüßt eine ISet<T> Schnittstelle. Da HashSet<T> kam in nur .NET 3.5 (was an sich war überraschend) Ich vermute, wir können schließlich eine umfangreichere Sammlung von Set-basierten Typen. Insbesondere LinkedHashSet das Äquivalent von Java, die Auftrag unterhält, würde in einigen Fällen nützlich sein.

Um fair zu sein, die ICollection<T> Schnittstelle deckt tatsächlich das meiste, was Sie in ISet<T> wollen würden, so vielleicht ist das nicht erforderlich ist. Sie könnte jedoch argumentieren, dass der Hauptzweck eines Satzes (die meist über Haltung ist, und nur tangential etwa über die Elemente zu durchlaufen zu können) ist nicht ganz das gleiche wie eine Sammlung. Es ist schwierig. In der Tat kann ein wirklich mathematischer Satz nicht iterable oder zählbar sein - zum Beispiel könnten Sie „um die Menge der reellen Zahlen zwischen 1 und 2“ haben Wenn Sie einen beliebige Genauigkeit numerischen Typen hätten, würde die Zahl unendlich sein und iterieren es würde keinen Sinn machen.

Auch die Idee der „Hinzufügen“ auf einen Satz nicht immer sinnvoll. Wandelbarkeit ist eine heikle Angelegenheit, wenn Sammlungen Benennung: (

EDIT: Okay, auf den Kommentar antwortet: das Stichwort set ist in keiner Weise ein Vermächtnis mit Visual Basic zu tun. Es ist die Operation, die Sätze den Wert einer Immobilie, vs get die ruft die Operation. Das hat nichts mit der Idee eines Satzes als eine Operation zu tun.

Stellen Sie sich vor, dass anstelle wurden die Schlüsselwörter tatsächlich fetch und assign, z.

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

Ist der Zweck es klar? Nun ist die real Äquivalent, dass in C # ist nur

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

Wenn Sie also schreiben:

x = y.Foo;

das wird den get Teil des Anwesens nutzen. Wenn Sie schreiben:

y.Foo = x;

, die den set Teil verwendet wird.

Ist das ein klarer?

Andere Tipps

Es gibt keine Set<T>. Dieses BCL Team Blog Post hat viel von Details auf HashSet einschließlich einer nicht ganz schlüssig Diskussion einschließlich Hash im Namen. Ich vermute, dass nicht jeder auf dem BCL-Team die Entscheidung gefallen hat den Namen HashSet<T> zu verwenden.

Der einzige Grund dafür scheint Mangel an Ressourcen, um diese im Idealfall in .NET 3.5 zu implementieren.

.NET 4.0 gehören ISet , sowie die neue Implementierung zusätzlich zu HashSet - SortedSet . Schauen Sie sich die bereitgestellten Links zu MSDN Library -. Sie in .NET 4.0 Beta1 bereits verfügbar sind

set ist eine Sprache C # Schlüsselwort, das seit der Version 1.0 um war. I wird verwendet, um den Wert-Zuordnung Teil einer Eigenschaft zu definieren (und get verwendet wird, um den Wert Leseteil einer Eigenschaft zu implementieren). In diesem Zusammenhang sollten Sie das Wort verstehen ‚Set‘ als Verb, wie in Wert zu setzen.

HashSet<T> ist ein besonderes implmentation des mathematischen Konzept einer Set. Es wurde zuerst in .NET 3.5 eingeführt. Dieser Blog-Eintrag vom BCL-Team erklärt mehr über die Argumentation dahinter, sowie einige Hinweise, warum der Name ist HashSet<T> und nicht nur Set<T>: http://blogs.msdn.com/bclteam/archive/2006/11/09/introducing-hashset-t -kim-hamilton.aspx .

Im Fall von HashSet<T> Sie das Wort ‚Set‘ als Substantiv verstehen sollten.

Set ist ein reserviertes Schlüsselwort in VB.NET (es ist das Äquivalent in C # setzen). VB.NET kann Klassen verwenden / Methoden / etc mit dem gleichen Namen wie Keywords, aber sie haben in eckigen Klammern geschrieben werden, was es ist hässlich:

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 Recht Ich verstehe Ihre Frage jetzt
Nicht sicher, ob ich 100% die Notwendigkeit eines ISet<T> sehen.
Ich denke, die Frage ist, was tun Sie als wesentliches Verhalten für einen Satz sehen?
Ist es Hinzufügen, Entfernen Enthält usw. Wenn ja, dann ICollection<T> bereits eine Schnittstelle für das zur Verfügung stellt.
Wenn es etc Operationen wie Union, Intersect, Set ist dann, dass etwas, das Sie zu abstrahieren generisch genug, um einen Vertrag Stil Durchsetzung betrachten würden?

Ich muss sagen, ich weiß nicht, die richtige Antwort auf diese - ich denke, es ist eine offene Frage, und ich vermute, dass das BCL-Team so etwas wie dieses kann am Ende in einer zukünftigen Version setzen, aber das ist bis zu ihnen. Ich persönlich nicht, dass es so massiv fehlendes Stück Funktionalität sehen

Original Beitrag

Der BCL nicht über eine Set Sammlung überhaupt, zumindest nicht so weit ich weiß.
Es gibt ein paar 3rd-Party-Set Libs heraus dort wie Iesi.Collections
HashSet<T> wurde .NET 3.5 erstellen eine schnelle gesetzt Sammlung d.h eingeführt in dem Sie eine Sammlung ohne Duplikate. Es hat auch typische Mengenoperationen wie Union und Mitglied werden. Schauen Sie sich diesen Link von BCL-Team auf HashSet

Sie würden es in der Regel verwenden, wo Sie zuvor List<T> verwenden musste und nach Dubletten überprüfen, wenn das Hinzufügen.
Hinzufügen von Elementen zu einem HashSet<T> kann auch deutlich schneller als Liste

Einige weitere Details:
Ein weiteres nettes Feature von HashSet ist, dass es keine Ausnahme werfen, wenn Sie versuchen, und fügen Sie ein Duplikat es nicht nur den doppelten Eintrag hinzuzufügen, die Sie spart mit vielen try.catch Blöcken um jeden zu setzen hinzufügen - schön:)

Ich bin mir ziemlich sicher, dass es keine Set<T> Klasse in der BCL, zumindest in .NET 3.5 (und nicht .NET 4.0 entweder wie es scheint). Was würden Sie erwarten, ist die Notwendigkeit für eine solche Klasse eigentlich?

HashSet<T> selbst ist nur eine gewöhnliche Satz Datenstruktur, die Hash-Codes (die GetHashCode Methode eines Objekts) verwendet Elemente zu vergleichen. Das ist einfach eine effiziente Möglichkeit, eine Reihe Art der Umsetzung. (Andere Methoden zur Gleichstellung Überprüfung habe wahrscheinlich geringere Leistung.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top