【问题标题】:Add to int array from dataset从数据集中添加到 int 数组
【发布时间】:2010-11-18 16:06:08
【问题描述】:

我必须将数据集中所有状态值与“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”的公共定义

【问题讨论】:

    标签: c# ado.net


    【解决方案1】:

    我建议使用 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<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();
    

    【讨论】:

    • 对我来说这完全是一个新概念 :)
    【解决方案2】:

    你会想要这样的:

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

    【讨论】:

      【解决方案3】:

      您不能在 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&lt;int&gt; 而不是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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-08
        相关资源
        最近更新 更多