2012-02-07 8 views
7

Correlati: A list of multiple data types?Memorizzazione di tipi diversi all'interno di un elenco?

Desidero sapere come memorizzare diversi tipi di array (inclusi i tipi di sistema) all'interno di un array.

La domanda precedente spiega come creare un elenco che consenta solo le classi definite dall'utente utilizzando le interfacce. Ma cosa succede se voglio una lista che accetterà solo doppi e archi? E i doppi e una classe che ho scritto? Che dire di una lista che accetterà solo una classe scritta e una classe scritta da qualcun altro (quindi non posso aggiungere un'interfaccia alla classe di terze parti, credo).

Ho considerato l'utilizzo di List<object>, ma non so se questa è la migliore pratica accettata.

+0

Come probabilmente si può dire, sono abbastanza nuovo in C#. – Michael0x2a

+6

Perché vorresti farlo? Se pensi di avere quel bisogno, probabilmente c'è un modo migliore per avvicinarti a quello che stai costruendo. Specialmente se i tipi non hanno alcuna relazione tra di loro. –

+0

Sì, ma cosa succede se voglio una lista che accetta solo doppi e archi, e nient'altro? – Michael0x2a

risposta

4

È possibile specificare non solo i tipi personalizzati. List<int>, List<double>, List<string> funzionerà pure. Se è necessario memorizzare tipi misti - è necessario specificare la classe base più vicina per tutti i tipi. In List<object> può essere memorizzata l'istanza di qualsiasi tipo.

+0

Questo, tuttavia, non consente di accedere alle proprietà dei tipi all'interno della matrice. Cioè Se si prova ad avere un 'Elenco ' così lo si chiama 'Elenco ' per comprendere type1 e type2. Non sarà possibile cercare 'List.FirstOrDefault (i => i.PropertyOfType1AndType2)' (supponendo che type1 e type2 abbiano la proprietà simile). –

+0

@FranciscoSoto Penso che tu abbia ragione. Questo non dovrebbe essere necessario se stai scrivendo il tuo codice da zero. È importante scrivere un codice di qualità, ben congegnato. Anche se a volte è importante sapere come fare qualcosa di sporco se hai bisogno di fare un po 'di magia - per compiacere un cliente per es. –

2

È possibile creare una raccolta personalizzata in cui si implementa metodo Add(), che accetta solo doppie e stringa, qualcosa di simile:

void Add(object toAdd) 
{ 
    if (toAdd is string) 
     // add into inner collection ... 
     ... (same for double) 
} 

Ma, ad essere onesti, non posso davvero pensare a un modo che avresti bisogno di una collezione che accetti solo questi due tipi. Probabilmente si può risolvere il problema in qualche altro modo ...

1

è necessario creare una classe

public class MyClass 
{ 
    public string x {get;set;} 
    public double y{get;set;} 
} 

Poi basta creare un array di quella classe. Questa classe può avere qualunque tipo tu voglia, questa è la bellezza di avere oggetti in un linguaggio orientato agli oggetti.

public MyClass[] someList=new MyClass[insert_number_of_elements]; 
4

Se si è disposti a dare via la sicurezza di tipo è possibile utilizzare un ArrayList, che era l'unico modo per utilizzare un elenco di farmaci generici roba pre.

È possibile inserire un codice wrapper attorno ad esso per accettare solo doppi e stringhe.

+0

Puoi aggiungere qualcosa a un ArrayList? Ad esempio, int, string, Person? Come si fa a ottenere un elemento? devi lanciarlo? – Loaderon

1

È inoltre possibile utilizzare il? opzione, creare un elenco del seguente tipo:

public class MyClass 
{ 
    public string? x {get;set;} 
    public double? y {get;set;} 
} 

In questo modo è possibile selezionare se nessuno, uno o entrambi possono avere un valore.

O se non vi piacciono le funzioni HasValue/valore:

public class MyClass 
{ 
    public enum EType { String, Double }; 

    EType TypeFilled {get; private set } 

    string _x; 
    public string X { get { return _x; }; set { _x = value; TypeFilled = EType.String; } 
    double y; 
    public double y { get { return _y; }; set { _y = value; TypeFilled = EType.Double; } 
} 

In questo modo la proprietà typeFilled decide ciò che è riempita. È possibile aggiungere la convalida per evitare di essere impostato due volte, ecc.

Problemi correlati