public class PriceDetail
{
public int ID{ get; set; }
public string Package { get; set; }
public string Currency { get; set; }
public int Price { get; set; }
public string PackageType { get; set; }
public List<string> Items { get; set; }
}
[WebMethod]
public static string GetCardDetail(string category)
{
string cs = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
List<PriceDetail> pricingCard = new List<PriceDetail>();
string query = "select [PricingID],[Package],[Currency],[Price],[PackageType] from [SeoDatabase].[dbo].[tbl_Pricing] where Category = @Category";
SqlConnection con = new SqlConnection(cs);
SqlCommand cmd = new SqlCommand(query, con);
cmd.Parameters.AddWithValue("@Category", category);
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
PriceDetail priceDetail = new PriceDetail();
priceDetail.ID = Convert.ToInt16(rdr["PricingID"]);
priceDetail.Package = rdr["Package"].ToString();
priceDetail.Currency = rdr["Currency"].ToString();
priceDetail.Price = Convert.ToInt16(rdr["Price"]);
priceDetail.PackageType = rdr["PackageType"].ToString();
pricingCard.Add(priceDetail);
}
con.Close();
List<string> items = new List<string>();
string queryList = "select [Item] from [SeoDatabase].[dbo].[tbl_PricingItem] where PricingID = @pricingID";
int i = 0;
while(i < pricingCard.Count)
{
SqlCommand listCmd = new SqlCommand(queryList, con);
con.Open();
listCmd.Parameters.AddWithValue("@pricingID", pricingCard[i].ID);
SqlDataReader listReader = listCmd.ExecuteReader();
while (listReader.Read())
{
items.Add(listReader["Item"].ToString());
}
pricingCard[i].Items = items;
items.Clear();
con.Close();
i++;
}
string obj = JsonConvert.SerializeObject(pricingCard);
return obj;
}
当我在第二个循环中到达时,一切都变好了,而在这个循环中,我在第0个循环中索引了
答案 0 :(得分:1)
不按预期运行的原因是类型为items
的{{1}}是引用类型,而不是值类型。在使用托管语言(例如C#)进行开发时,您需要很好地理解这一概念。 MSDN - Reference and Value
简而言之,List<string>
的意思是pricingCard[i].Items = items;
现在是对pricingCard[i].Items
的引用。这意味着,在之后的任何给定时间,对items
的评估只会“使”您参考pricingCard[i].Items
,因此对items
的任何更改都将反映您对它所做的所有参考。
在每个循环的开始,您需要做的是用items
“重新实例化” items
。这就是说:创建列表的新实例,并在items = new List<string>()
的下一次迭代中引用新实例。
pricingCard[i].Items
或者,直接添加项目:
while(i < pricingCard.Count)
{
items = new List<string>();
// Do the rest of your process
}
PS
而不是使用:
while (listReader.Read())
{
pricingCard[i].Items.Add(listReader["Item"].ToString());
}
尝试:
int i = 0;
while(i < pricingCard.Count)
{
i++;
}