2009-09-16 9 views
5

Uno dei miei maggiori problemi che riguardano il passaggio da Java a .Net è il fatto che non esiste un'interfaccia Set in .Net. So che ci sono biblioteche che potrei andare a scaricare, ma qual è la ragione per non averlo integrato? Ci sono mappe (dizionario) ed elenchi, ma perché non un set?Perché .Net non ha una struttura dati impostata?

Edit: vorrei chiarire che non tutti usano .Net 3.5 ancora - così sto più o meno riferimento alle vecchie versioni di Net

risposta

8

Penso che sia semplicemente un'omissione degli scrittori BCL. .NET 3.5 ha una classe HashSet; per le versioni precedenti, consiglio di includere un dizionario < T, oggetto >, con valori null nel campo del valore, per replicare O (1) aggiungere, rimuovere e cercare il tempo.

+1

Questo è esattamente il modo in cui le implementazioni di Set di Java funzionano, tra l'altro. –

3

Ci sono HashSet<T> in questi giorni, ma purtroppo nessuna interfaccia di cui sono a conoscenza.

2

Forse il ragionamento è che un set è in realtà solo un elenco con dettagli di implementazione particolari che restringono gli elementi in esso contenuti. Poiché la distinzione dell'elenco è nell'implementazione piuttosto che nell'interfaccia, non è necessaria un'interfaccia.

Come altri hanno già menzionato, la FCL ha il HashSet<T>.

+1

Hai dimenticato una grande differenza tra liste e serie: una lista è ordinata mentre un set non lo è. –

+1

Ho notato che gli implementatori .Net a volte adottano un approccio troppo accademico alla piattaforma. Costruisci gli strumenti di base. Tutto il resto è un dettaglio di implementazione. –

+0

Restringere gli elementi per essere distinti è LONTANO da un dettaglio di implementazione. Fa molto parte dell'interfaccia per il tipo di dati. – erikkallen

4

.NET 3.5 ha HashSet che consente di impostare tutte le operazioni.

+0

Quello che vorrei sapere in particolare è il motivo per cui non è stato implementato prima –

+0

Solo il team BCL può rispondere. Mi sembra un'omissione significativa per me. – thecoop

1

Forse a causa di considerazioni educative.

Un tipico programmatore vede un set come un contenitore magico che funziona solo indipendentemente dal numero di elementi in esso contenuti.

Se non esiste un set esplicito, un programmatore è costretto a scegliere tra altri tipi e, nel farlo, riflettere sul conteggio degli elementi e sulla struttura dei dati appropriata per ottenere buone prestazioni.

Solo una supposizione selvaggia.

3

Come altri hanno notato, c'è uno HashSet<T>, che in realtà è solo un set.

La ragione per cui ha "hash" davanti (un dettaglio di implementazione dell'insieme poiché utilizza gli hash per eliminare i duplicati) è perché Set è una parola chiave in VB.NET.

+0

Tidbit interessante –

5

In .NET 4.0 HashSet verrà adattato anche per implementare la nuova interfaccia ISet.

2

Sono passato anche da Java a .Net di recente (a causa di un impiego professionale) e devo ammettere che i miei problemi iniziali sono stati anche nelle raccolte.
Nella versione .Net corrente (3.5 e si parla di C#) si dovrebbe orientarsi su

  • ICollection
  • IList<T>
  • List<T>
  • IDictionary<TKey,TValue>
  • IEnumerable<T>

questi sono i più comunemente usati (spero didn Mi manca uno)

+0

Uso anche IEnumerable nei punti, quando voglio una enumerazione generalizzata senza informazioni sul tipo e anche per superare .NET generics non-covariance. – thecoop

Problemi correlati