Warum haben HashSet aber nicht in C # Stellen?
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.
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.)