2009-07-10 3 views
5

j'ai un arraylist qui obtient différents types de valeurs en elle, 1er à valeur>chaîne, 2ème forte valeur>datetime, 3ème valeur ->booléenne et 4ème valeur est int, comment puis-je trouver Thier type et affecter ces valeurs en conséquence, toute aide est appréciée :)obtenir le type d'objet et attribuer des valeurs en conséquence

voici mon code:

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

Merci à tous, mon code 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

Ajoutez typeof() devant le type, par ex. typeof (chaîne), typeof (DateTime). –

+0

'2.0' en lui-même est un très mauvais choix de tag. S'il vous plaît prêter plus d'attention aux invites de suggestion automatique pour vos questions à l'avenir: le bon marquage est la façon dont les personnes qualifiées trouveront votre question. –

+2

Si vous le pouvez, sortez de cette situation. Une liste de tableaux est une façon terrible de représenter un quadruple tuple de données. Envisagez de définir une classe personnalisée qui contient ces quatre données et utilisez-la à la place. –

Répondre

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 sont presque toujours la mauvaise façon de le faire. Même si vous ne savez pas ce que la liste va contenir, il vaut mieux utiliser le List<Object> générique parce que cela communique aux autres que la liste peut vraiment contenir n'importe quoi et n'est pas juste un reste d'un programmeur .Net 1.1.

Autre que cela, le mot-clé is doit faire ce que vous voulez:

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

Mise à jour Je sais que c'est vieux, mais il arrive dans mes avis aujourd'hui. La lecture à nouveau, il me semble qu'une autre bonne façon de le faire est par la résolution de type pour une fonction surchargée:

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

DoSomething(obj); 
+0

"Mais à part ça, Mme Lincoln ..." – mquander

1

La solution la plus simple est de ne pas utiliser une boucle puisque vous savez exactement ce qui est dans votre liste.

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

Les index peuvent être différents cependant. Pas toujours fiable. –

+0

Je ne recommanderais pas cela parce que les distributions directes vont lancer des erreurs d'exécution si la distribution échoue. –

0

Juste un peu de code un peu plus propre:

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 votre tableau a toujours les mêmes objets dans le même endroit cependant, l'index juste dans le tableau et faire des moulages directs.

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

Le procédé GetType renvoie le System.Type de l'objet. Par conséquent, vous devez le comparer avec l'autre System.Type, que vous obtenez en utilisant typeof.

1

Si votre liste contient exactement une valeur de chaque type que vous pouvez stocker dans un Dictionary au lieu (si vous utilisez un ArrayList n'est pas une exigence spécifique), et juste récupérer la valeur en fonction du type demandé:

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

Cela rendra le processus de récupération des valeurs légèrement plus robuste car il ne dépend pas des valeurs apparaissant dans un ordre spécifique.

Exemple de conversion du ArrayList à un tel dictionnaire:

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

Au lieu d'utiliser des types primitifs, je serais une classe abstraite qui encapsulées chaque type de données.Ensuite, la logique de gestion de ce type peut être intégrée dans la classe elle-même.

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

En général, tout code qui passe sur le type d'un objet doit être considéré comme une odeur de conception - il ne peut pas nécessairement se tromper, mais il est probablement une bonne idée de prendre un autre coup d'oeil.

Alors que l'écriture d'une classe pour encapsuler un type simple peut sembler un travail inutile, je ne pense pas avoir jamais regretté de le faire.

+0

La création de méthodes d'extension pour des types simples serait probablement moins fastidieuse que l'encapsulation de chacune d'entre elles. – Shocked

Questions connexes