Domanda

Vecchia questione

La mia comprensione è che il C# è in un certo senso HashSet e set tipi di.Ho capito di cosa HashSet è.Ma perché set è una parola separata?Perché non ogni set è HashSet<Object>?

Nuova domanda

Perché C# non ha generico Set tipo, simile a Dictionary tipo?Dal mio punto di vista, mi piacerebbe avere un set standard di ricerca/aggiunta/eliminazione di prestazioni.Non mi interessa molto se è realizzato con hash o qualcos'altro.E allora perché non fare un set di classe, che sarebbe in realtà essere implementato come un HashSet in questa versione di C#, ma forse un po ' diversi in una versione futura?

O, perché no, almeno interfaccia ISet?

Risposta

Imparato grazie a tutti coloro che hanno risposto qui di seguito: ICollection implementa un sacco di quello che ci si aspetterebbe da ISet.Dal mio punto di vista, però, ICollection implementa IEnumerable mentre l'imposta non devono essere enumerabile --- esempio:insieme dei numeri reali tra 1 e 2 (anche di più, i set possono essere generati in modo dinamico).Sono d'accordo questo è un minore sbraitare, come e 'normale che i programmatori' raramente bisogno di insiemi non numerabili.

Ok, penso di farlo. HashSet era assolutamente pensato per essere chiamato Set ma la parola Set è riservata, in un certo senso.Più specificamente, i creatori .NET architettura voluto avere un insieme coerente (sic!) di classi per le diverse lingue.Questo significa che ogni nome di standard di classe non deve coincidere con qualsiasi parola chiave .NET lingue.La parola Set, tuttavia, è utilizzato in VB.NET che in realtà è case-insensitive (è?) così, purtroppo, non c'è spazio per maneuvre c'.

Mistero risolto :)

Epilogo

La nuova risposta da Alex Y.link al Pagina di MSDN che descrive il prossimo .NET 4.0 interfaccia ISet che si comporta in modo molto simile a come l'ho pensato e attuato da HashedSet.Lieto fine.

È stato utile?

Soluzione

(La tua domanda originale su set è stato risposto.IIRC, "insieme" è la parola con più significati diversi in lingua inglese...ovviamente questo ha un impatto computing troppo.)

Penso che sia bene avere HashSet<T> con quel nome, ma mi piacerebbe certamente il benvenuto ad un' ISet<T> l'interfaccia.Dato che HashSet<T> arrivò solo nel .NET 3.5 (che, di per sé, è stato sorprendente) ho il sospetto che potrebbe alla fine avere una raccolta più completa di set-in base tipi.In particolare, l'equivalente di Java LinkedHashSet, che mantiene l'ordine di inserimento dei dati, potrebbe essere utile in alcuni casi.

Per essere onesti, la ICollection<T> interfaccia in realtà copre la maggior parte di ciò che si può desiderare in ISet<T>, così forse , che non è necessario.Tuttavia, si potrebbe sostenere che lo scopo principale di un insieme (che è in gran parte su di contenimento, e solo tangenzialmente essere in grado di scorrere gli elementi) non è proprio la stessa come una collezione.E ' complicato.Infatti, una vera e propria matematica non può essere iterable o numerabile - per esempio, si potrebbe avere "l'insieme dei numeri reali tra 1 e 2." Se hai avuto un'arbitraria precisione di tipo numerico, il conteggio sarebbe infinita e scorrendo non avrebbe alcun senso.

Allo stesso modo l'idea di "aggiunta" di un insieme non sempre ha senso.Mutevolezza è un'impresa molto difficile quando collezioni denominazione :(

EDIT:Bene, per rispondere al commento:la parola chiave set non è in alcun modo un lascito a che fare con Visual Basic.E ' l'operazione che set il valore di una proprietà, vs get che recupera l'operazione.Questo non ha nulla a che fare con l'idea di un set come un'operazione.

Immaginate che invece le parole chiave sono state effettivamente fetch e assign, ad es.

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

È lo scopo chiaro che c'?Ora il reale equivalente che in C# è solo

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

Quindi, se si scrive:

x = y.Foo;

che utilizzerà il get parte della proprietà.Se tu scrivi:

y.Foo = x;

che utilizzerà il set parte.

È che qualsiasi idea più chiara?

Altri suggerimenti

Non vi è alcun<T>.Questo BCL post sul Blog del team ha un sacco di dettagli su HashSet tra cui una non del tutto conclusivi discussione tra hash del nome.Ho il sospetto che non tutti i team BCL è piaciuta la decisione di utilizzare il nome HashSet<T>.

L'unica ragione per questo mi sembra che la mancanza di risorse per attuare questo situato in una posizione ideale .NET 3.5.

.NET 4.0 includono ISet, così come la sua nuova implementazione, oltre a HashSet - SortedSet.Controllare i collegamenti forniti di MSDN library - sono già disponibili in .NET 4.0 beta1.

set è un linguaggio C# parola chiave che è stato intorno sin dalla versione 1.0.È utilizzato per definire il valore-assegnazione di parte di un immobile (e get è utilizzato per implementare il valore di lettura di parte di una proprietà).In questo contesto è necessario comprendere la parola 'insieme' come un verbo, come l'impostazione di un valore.

HashSet<T> è un particolare di un'implementazione del concetto matematico di un Insieme.E ' stato introdotto nel .NET 3.5.Questo post sul blog del Team BCL spiega di più su il ragionamento dietro di esso, così come alcuni indizi, perché il nome è HashSet<T> e non solo Set<T>: http://blogs.msdn.com/bclteam/archive/2006/11/09/introducing-hashset-t-kim-hamilton.aspx.

In caso di HashSet<T> si dovrebbe capire la parola 'insieme' come un sostantivo.

Impostare una parola chiave riservata in VB.NET (e ' l'equivalente di impostare in C#).VB.NET possibile utilizzare classi/metodi/etc con lo stesso nome come parole chiave, ma devono essere scritti tra parentesi quadre, che è brutto:

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 giusto ho capito la tua domanda
Non sono sicuro 100% posso vedere la necessità di un ISet<T>.
Credo che la domanda è che non si vede come essenziale del comportamento di un insieme?
È possibile Aggiungere,Rimuovere, Contiene etc.Se è così allora ICollection<T> già fornisce un'interfaccia per che.
Se è impostato operazioni come l'Unione, l'Intersezione, ecc quindi è qualcosa che ti piacerebbe prendere in considerazione sufficientemente generico per astrarre un contratto di stile di esecuzione?

Devo dire che non so la risposta giusta a questo, penso sia un dibattito aperto e ho il sospetto che il team BCL può finire per mettere qualcosa di simile a questo in una versione futura, ma che a loro.Io, personalmente, non vedo come enorme pezzo mancante di funzionalità

Post Originale

Il BCL non dispone di un Set di raccolta a tutti, almeno non per quanto ne so.
Ci sono un paio di 3rd party Set libs là fuori, come Iesi.Collezioni
HashSet<T> è stato introdotto nel .NET 3.5 per creare un veloce ritiro io.e dove si desidera una collezione con duplicati non ammessi.Ha anche il tipico insieme di operazioni come Unione e di Partecipare.Check out questo link da BCL team HashSet

Si utilizza in genere, dove, in precedenza, era necessario utilizzare List<T> e verificare la presenza di duplicati quando l'aggiunta.
Aggiunta di elementi a un HashSet<T> può anche essere significativamente più veloce di Lista

Ulteriori dettagli:
Un'altra bella caratteristica di HashSet è che non lancia un'eccezione se si prova ad aggiungere un duplicato solo non riesce ad aggiungere la voce duplicata che consente di evitare di dover mettere un sacco di specialità.blocchi catch dietro ogni add - nizza :)

Sono abbastanza sicuro che non c'è Set<T> classe BCL, almeno in .NET 3.5 (e non .NET 4.0 o sembra).Cosa si aspetta è la necessità di una tale classe, comunque?

HashSet<T> di per sé è solo un normale set di dati struttura che si avvale di codici hash (il GetHashCode metodo di un oggetto) per confrontare gli elementi.Questo è semplicemente un modo efficace attuazione di un tipo di set.(Altri metodi per il controllo di uguaglianza sarebbe probabilmente hanno prestazioni inferiori.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top