2010-11-18 4 views
4

Je dois ajouter tous les ID de l'ensemble de données dont la valeur d'état est identique à "Active" dans le tableau int PromotionID. Comment est-ce possible. Qu'est-ce que je rate?Ajouter au tableau int de l'ensemble de données

int[] promotionID; 
foreach (DataRow dr in ds.Tables[0].Rows[i]["Status"].ToString() == "Active") 
{ 

    promotionID = new int[] { Convert.ToInt32(dr["Id"]) }; 
} 

L'erreur est:

foreach ne peut pas fonctionner sur des variables de type 'bool' parce que 'bool' ne contient pas de définition publique pour 'GetEnumerator'

Répondre

4

Vous voulez quelque chose comme ceci:

List<int> promotionLst = new List<int>(); 
foreach (DataRow dr in ds.Tables[0].Rows) { 
    if (dr["Status"].ToString() == "Active") { 
     promotionLst.Add(Convert.ToInt32(dr["Id"])); 
    } 
} 
int[] promotion = promotionLst.ToArray(); 
+0

Vous méritez tous les points mon pote! Merci :) – Ram

+0

De rien. –

2

Vous pouvez n'utilisez pas de condition de filtre dans la boucle foreach. Essayez ceci:

int[] promotion; 
foreach (DataRow dr in ds.Tables[0].Rows) 
{ 
    if (dr["Status"].ToString() == "Active") 
     promotionID = new int[] { Convert.ToInt32(dr["Id"]) }; 
} 

qui prend soin de la partie d'erreur de votre question, mais votre utilisation de promotionID semble incorrecte puisque vous écrasez sur chaque match positif. Vous devez utiliser un List<int> au lieu de int[] et utiliser promotion.Add(Convert.ToInt32(dr["Id"])) pour ajouter des numéros à la liste. Cela ressemble à:

var promotion = new List<int>(); 
foreach (DataRow dr in ds.Tables[0].Rows) 
{ 
    if (dr["Status"].ToString() == "Active") 
     promotion.Add(Convert.ToInt32(dr["Id"])); 
} 

Une autre option est LINQ comme Heinzi demonstrated.

6

Je suggère d'utiliser LINQ:

int[] promotionIDs = (from dr in ds.Tables[0].AsQueryable() 
         where dr.Field<string>("Status") == "Active" 
         select dr.Field<int>("Id")).ToArray(); 

Si vous voulez fixer votre code à la place, laissez-moi vous dire ce qui ne va pas avec elle:

foreach (DataRow dr in ds.Tables[0].Rows[i]["Status"].ToString() == "Active") 

Lorsque le i ne vient de? Vous utilisez foreach, vous n'avez donc pas besoin d'une variable de compteur. Votre boucle devrait ressembler à ceci:

foreach (DataRow dr in ds.Tables[0].Rows) { 
    if (dr.Field<string>("Status") == "Active") { 
     ... 
    } 
} 

Maintenant, comment ajouter l'Id à la rangée. Ce que vous faites ici ...

promotionID = new int[] { Convert.ToInt32(dr["Id"]) }; 

... est de créer un nouveau tableau (jeter tout ce qui était en elle) avec une valeur qui est l'identifiant de l'enregistrement en cours. Les tableaux ne sont pas de bonnes structures de données pour ajouter des éléments. Permettez-moi de vous suggérer d'utiliser une liste à la place:

List<int> promotionIDs = new List<int>(); 

foreach (DataRow dr in ds.Tables[0].Rows) { 
    if (dr.Field<string>("Status") == "Active") { 
     promotionIDs.Add(dr.Field<int>("Id")); 
    } 
} 

Si vous avez besoin d'un tableau, vous pouvez le convertir ensuite:

int[] promotionIDArray = promotionIDs.ToArray(); 
+0

C'est complètement un nouveau concept pour moi :) – Ram

Questions connexes