我必须将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'的公共定义
答案 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。