从数据集添加到int数组

时间:2010-11-18 16:06:09

标签: c# ado.net

我必须将Status值与“Active”相同的数据集中的所有Id添加到int数组PromotionID中。怎么可能。我错过了什么?

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

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

错误是:

  

foreach语句不能对'bool'类型的变量进行操作,因为'bool'不包含'GetEnumerator'的公共定义

3 个答案:

答案 0 :(得分:6)

我建议使用LINQ:

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

如果你想修改你的代码,让我告诉你它有什么问题:

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

i来自哪里?您正在使用foreach,因此您不需要计数器变量。你的循环应如下所示:

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

现在,如何将Id添加到数组中。你在这做什么......

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

...是创建一个 new 数组(抛弃其中的所有内容),其中包含一个值,即当前记录的Id。数组不是添加项目的好数据结构。我建议改用List:

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"));
    }
}

如果你仍然需要一个数组,你可以在之后进行转换:

int[] promotionIDArray = promotionIDs.ToArray();

答案 1 :(得分:4)

你会想要这样的东西:

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();

答案 2 :(得分:2)

您不能在foreach循环中使用过滤条件。试试这个:

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

这会处理您问题的错误部分,但是您对promotionID的使用看起来不正确,因为您在每次正面匹配时都会覆盖它。您应该使用List<int>代替int[]并使用promotion.Add(Convert.ToInt32(dr["Id"]))将数字添加到列表中。看起来像是:

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

另一个选项是LINQ为Heinzi demonstrated