2009-07-10 15 views
5

tengo un ArrayList que obtiene tipo diferente de valores en ella, primero con valor>cadena, segundo de valor>fecha y hora, tercero valor ->booleano y cuarto valor es int, ¿cómo puedo encontrar emabrgo tipo y asignar esos valores en consecuencia, cualquier ayuda se agradece :)obtener el tipo de objeto y asignar valores en consecuencia

aquí está mi código:

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....} 
      } 

Gracias a todos, mi código final:

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

Agregue typeof() al frente del tipo, p. Ej. typeof (cadena), typeof (DateTime). –

+0

'2.0' en sí mismo es una opción de etiqueta realmente pobre. Preste más atención a las sugerencias automáticas para sus preguntas en el futuro: el etiquetado correcto es la forma en que las personas calificadas encontrarán su pregunta. –

+2

Si puede, salga de esta situación. Una lista de matriz es una manera terrible de representar una cuatro tupla de datos. Considere la posibilidad de definir una clase personalizada que contenga estos cuatro datos y usar eso en su lugar. –

Respuesta

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 en .Net 2.0 son casi siempre la manera incorrecta de hacerlo. Incluso si no sabe lo que contiene la lista, es mejor que use el genérico List<Object> porque eso le comunica a otros que la lista realmente podría contener cualquier cosa y que no es solo un sobrante de un programador .Net 1.1.

Aparte de eso, la palabra clave is debe hacer lo que quiera:

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

actualización Sé que esto es viejo, pero surgen en mis avisos de hoy. Al leerlo de nuevo, se me ocurre que otra buena manera de hacer esto es a través de la resolución del tipo de una función sobrecargada:

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

DoSomething(obj); 
+0

"Pero aparte de eso, Sra. Lincoln ..." – mquander

1

La solución más simple es no utilizar un bucle ya que usted sabe exactamente lo que está en su lista.

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

Sin embargo, los índices pueden ser diferentes. No siempre confiable. –

+0

No recomendaría esto porque las conversiones directas arrojarán errores de tiempo de ejecución si falla el lanzamiento. –

0

Sólo un poco de código un poco más limpio:

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....} 
     } 

Si la matriz siempre tiene los mismos objetos en el mismo lugar sin embargo, el índice solo en la matriz y hacer moldes directos.

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....} 
     } 

El método GetType devuelve el System.Type del objeto. Por lo tanto, debe compararlo con el otro System.Type, que obtiene al usar typeof.

1

Si la lista contiene exactamente un valor de cada tipo se puede almacenar en un Dictionary lugar (si se utiliza un ArrayList no es un requisito específico), y acaba de recuperar el valor basado en el tipo de solicitud:

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

Esto hará que el proceso de recuperación de los valores sea un poco más robusto ya que no depende de los valores que aparecen en un orden específico.

Ejemplo de convertir el ArrayList a un diccionario como:

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

En lugar de utilizar tipos primitivos, tendría una clase abstracta que encapsula cada tipo de datos.Entonces, la lógica de manejar ese tipo se puede integrar en la clase misma.

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

En general, cualquier código que cambia el tipo de un objeto debe ser considerado un olor diseño - no necesariamente puede estar equivocado, pero es probablemente una buena idea para tener otra mirada en ella.

Si bien escribir una clase para encapsular un tipo simple puede parecer un trabajo innecesario, no creo haberme arrepentido de haberlo hecho alguna vez.

+0

Crear métodos de extensión para tipos simples probablemente sería menos complicado que encapsular cada uno de ellos. – Shocked

Cuestiones relacionadas