遍历对象列表时面临的问题

时间:2020-05-30 05:38:57

标签: c# asp.net

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个循环中索引了

1 个答案:

答案 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++;
}