.NET Framework Tipo di contenitore standard per proprietà a più valori?

2

Mi piacerebbe creare una semplice proprietà di classe che possa contenere più valori impostati dall'esterno. (I valori sono dello stesso tipo). Esempio di nome della proprietà e articoli contenuti:

KnownHidScanners

"\?\ACPI#IDEA0100#4&b74a345&0#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}"
"\?\HID#VID_045E&PID_071D&MI_00#9&e6a1767&0&0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}"

Esiste un approccio standard in .NET per il tipo di dati di tale proprietà di classe multi-valore?

Durante la ricerca di MSDN per proprietà multi-valore, posso trovare Proprietà con Valori multipli articolo di concetto che suggerisce PropertyValueCollection tipo di dati. Ma se controlli il tipo di dati più vicino, è troppo strettamente correlato a ActiveDirectory .

Off mano posso implementare la proprietà come

  • array di tipo
  • raccolta di tipo
  • elenco di tipo

ma quale è l'approccio più utilizzato in out-of-the-box oggetti quando hanno bisogno di proprietà a più valori? Non sono abbastanza a lungo con l'ecosistema .NET per osservare ciò che viene generalmente utilizzato.

Nota: questa è not una domanda basata sull'opinione. Sto chiedendo agli sviluppatori che sono abbastanza a lungo con il framework che l'approccio è già utilizzato in modo da poter essere coerente con gli standard.

Modifica: la chiarezza è migliorata dopo che il primo rispondente ha scritto di aver letto male la domanda

    
posta miroxlav 29.10.2014 - 17:17
fonte

3 risposte

2

Ok, nel frattempo ho investito più tempo e ho fatto il mio studio sull'argomento.

Risultati:

  • controllando attraverso la finestra di ispezione Oggetto come le proprietà contenenti la parola "Articoli" sono dichiarate nelle librerie esistenti rivela in qualche modo una sorpresa - Ho trovato ogni forma: array, collezione, elenco e tipi personalizzati

  • i tipi dominanti sono questi due: collezioni (generiche o ereditate) e liste (per lo più generiche)

  • le risposte in questa domanda fanno luce quando preferire la raccolta e quando la lista. La chiave è nel carattere della classe: le raccolte sono consigliate per le classi esposte (API ecc.), Le liste sono più preferite per le cose di implementazione interna

    • qui si deve notare che Collection<T> non fa più parte di System.Collections.Generic da .NET 3.0, è stato spostato in System.Collections.ObjectModel
  • se la proprietà avrà alcuni vantaggi evidenti da un tipo specifico, quindi ignorare la raccomandazione di cui sopra e utilizzare quel tipo. Esempio è out-of-the-box String.Chars che è un array.

  • la definizione del tipo di contenitore multivalore personalizzato (con elenco di elementi basato su alcuni dei precedenti) ha il suo posto se voglio aggiungere alcune proprietà / metodi personalizzati agli oggetti o per manipolarli con l'elenco ecc.

  • sono disponibili anche alcune linee guida per la progettazione della proprietà da Microsoft, ma per questo argomento non sono molto utili

risposta data 31.10.2014 - 11:30
fonte
5

Per una proprietà che con valori di stringa del genere, avrei:

List<string> KnownHidScanners = new List<string>();

Tuttavia, se esporrai questa proprietà esternamente come API, ci sarà:

ICollection<string> KnownHidScanners = new List<string>();

o più appropriatamente è creare il tuo tipo che erediti da ICollection come:

public class ScannerCollection : ICollection<string>
{
    //Class definition and implementation of ICollection<T>.
}

Vedi ICollection (T) Interface documentation.

Se esporti esternamente la proprietà, ma non vuoi che l'utente sia in grado di modificare la raccolta, dovresti utilizzare la classe ReadOnlyCollection(T) come:

ReadOnlyCollection<string> KnownHidScanners = new ReadOnlyCollection<string>(myPrivateListOfScanners);
    
risposta data 30.10.2014 - 22:59
fonte
3

Con il moderno .NET / C # cerchiamo di usare i generici. Consulta lo spazio dei nomi System.Collections.Generic

Raccomando List<T> finché non trovi qualcosa che non fa per te.

Se hai bisogno dell'accesso casuale a più di 3 valori, vai con Dictionary<K,T>

Per un piccolo numero di valori in cui sai sempre dove sono, puoi usare Tuples (come una coordinata 3D o una chiave complessa, se non ci fosse un'altra struttura dati da usare)

    
risposta data 30.10.2014 - 23:06
fonte

Leggi altre domande sui tag