2009-07-10 12 views
5

ho un ArrayList che ottiene diversi tipi di valori in esso, prima a valore>stringa, 2 ° a valore>datetime, terzo valore ->booleano e 4 ° valore è int, come faccio a trovare burbero tipo e assegnare quei valori di conseguenza, ogni aiuto è apprezzato :)ottenere tipo di oggetto e assegnare i valori di conseguenza

ecco il mio codice:

foreach (object obj in lstTop) 
      { 

       if(obj.GetType() == string) 
       {do this...) 
       else if(obj.GetType() == DateTime) 
       {do this....} 
       else if(obj.GetType() == bool) 
       {do this....} 
       else if(obj.GetType() == Int) 
       {do this....} 
      } 

Grazie a tutti, il mio codice finale:

string Subscription = ""; 
     DateTime issueFirst; 
     DateTime issueEnd; 

     foreach (object obj in lstTop) 
     { 
      ///Type t = obj.GetType(); 
      if (obj is string) 
       Subscription += obj + ","; 
      else if (obj is DateTime) 
      { 
       Subscription += Convert.ToDateTime(obj).ToShortDateString() + ","; 
      } 
      /// else if (t == typeof(DateTime))     
     } 
    return ("User Authenticated user name: " + userName + ", Subscription: " + Subscription); 
+0

Aggiungere typeof() davanti al tipo, ad es. typeof (stringa), typeof (DateTime). –

+0

"2.0" di per sé è una scelta di tag davvero scarsa. Si prega di prestare maggiore attenzione ai suggerimenti di auto-suggerimento per le vostre domande in futuro: il tag corretto è il modo in cui le persone qualificate troveranno la vostra domanda. –

+2

Se possibile, esci da questa situazione. Una lista di array è un modo terribile di rappresentare una quattro-tupla di dati. Prendi in considerazione la definizione di una classe personalizzata che contenga questi quattro dati e utilizzi quella invece. –

risposta

7
foreach (object obj in lstTop) 
     { 

      if(obj is string) 
      {do this.....} 
      else if(obj is DateTime) 
      {do this.....} 
      else if(obj is bool) 
      {do this.....} 
      else if(obj is Int) 
      {do this.....} 
      else 
      { 
       // always have an else in case it falls through 
       throw new Exception(); 
      } 
     } 
2

ArrayLists in .Net 2.0 sono quasi sempre il modo sbagliato per farlo. Anche se non sai quale sarà la lista, è meglio usare il generico List<Object> perché ciò comunica agli altri che la lista potrebbe davvero contenere qualsiasi cosa e non è solo un residuo di un programmatore .Net 1.1.

Oltre a questo, la parola chiave is dovrebbe fare quello che vuoi:

if (obj is string) 
    // do this 
else if (obj is DateTime) 
    // do this 
// ... 

Aggiornamento So che questo è vecchio, ma è venuto nelle mie comunicazioni di oggi. La lettura di nuovo, mi viene in mente che un altro bel modo per farlo è attraverso la risoluzione tipo per una funzione di sovraccarico:

void DoSomething(string value) { /* ... */ } 
void DoSomething(DateTime value) { /* ... */ } 

DoSomething(obj); 
+0

"Ma a parte quello, Mrs. Lincoln ..." – mquander

1

La soluzione più semplice è di non usare un ciclo dal momento che si sa esattamente cosa c'è nella tua lista.

string myString = (string) lstTop[0]; 
DateTime myDate = (DateTime) lstTop[1]; 
bool  myBool = (bool)  lstTop[2]; 
int  myInt = (int)  lstTop[3]; 
+0

Gli indici possono essere diversi però. Non sempre affidabile. –

+0

Non lo consiglierei perché i cast diretti generano errori di runtime se il cast fallisce. –

0

Solo un po 'di codice leggermente più pulito:

foreach (object obj in lstTop) 
     { 

      if(obj is string) 
      {do this...) 
      else if(obj is DateTime) 
      {do this....} 
      else if(obj is bool) 
      {do this....} 
      else if(obj is int) 
      {do this....} 
     } 

Se l'array ha sempre gli stessi oggetti nella stessa posizione, però, solo indice nella matrice e fare calchi diretti.

0
 foreach (object obj in lstTop) 
     { 

      if(obj.GetType() == typeof(string)) 
      {do this...) 
      else if(obj.GetType() == typeof(DateTime)) 
      {do this....} 
      else if(obj.GetType() == typeof(bool)) 
      {do this....} 
      else if(obj.GetType() == typeof(int)) 
      {do this....} 
     } 

Il metodo GetType restituisce il System.Type dell'oggetto. Pertanto è necessario confrontarlo con l'altro System.Type, che si ottiene utilizzando typeof.

1

Se l'elenco contiene esattamente un valore di ogni tipo è possibile memorizzare in un Dictionary invece (se si utilizza un ArrayList non è un requisito specifico), e solo recuperare il valore in base al tipo di richiesta:

private Dictionary<Type, Object> data = GetDataList(); 
string myString = (string)data[typeof(string)]; 
int myInt = (int)data[typeof(int)]; 

Ciò renderà il processo di recupero dei valori leggermente più robusto poiché non dipende dai valori visualizzati in un ordine specifico.

Esempio di convertire l'ArrayList a tale dizionario:

ArrayList data = new ArrayList(); 
data.Add(1); 
data.Add("a string"); 
data.Add(DateTime.Now); 

Dictionary<Type, Object> dataDictionary = new Dictionary<Type, object>(); 
for (int i = 0; i < data.Count; i++) 
{ 
    dataDictionary.Add(data[i].GetType(), data[i]); 
} 
1

Invece di usare tipi primitivi, avrei una classe astratta che incapsulati ogni tipo di dati.Quindi, la logica di gestione di quel tipo può essere incorporata nella classe stessa.

foreach(MyBaseData data in lstData) 
{ 
    data.DoTheRightThing(); 
} 

In generale, qualsiasi codice che accende il tipo di un oggetto dovrebbe essere considerato un odore di progettazione - potrebbe non necessariamente essere sbagliato, ma è probabilmente una buona idea di prendere un altro sguardo a questo.

Mentre scrivere una classe per incapsulare un tipo semplice può sembrare un lavoro inutile, non credo di essermi mai pentito di averlo fatto.

+0

Creare metodi di estensione per tipi semplici sarebbe probabilmente meno problematico dell'incapsulamento di ognuno di essi. – Shocked

Problemi correlati