Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# forloop中的数组分配defaut会话值_C#_Asp.net_Arrays - Fatal编程技术网

C# forloop中的数组分配defaut会话值

C# forloop中的数组分配defaut会话值,c#,asp.net,arrays,C#,Asp.net,Arrays,在每个循环中,我需要数组serRefine的默认值,但它也需要serRefine[4]的旧值 for (int i = 0; i < rptSize.Items.Count; i++) { Label lblSizeCount = (Label)rptSize.Items[i].FindControl("lblSizeCount"); HiddenField hfSizeID = (HiddenField)rptSize.Items[i].FindControl("hf

在每个循环中,我需要数组serRefine的默认值,但它也需要serRefine[4]的旧值

for (int i = 0; i < rptSize.Items.Count; i++)
{
     Label lblSizeCount = (Label)rptSize.Items[i].FindControl("lblSizeCount");
     HiddenField hfSizeID = (HiddenField)rptSize.Items[i].FindControl("hfSizeID");

     string[] serRefine = (string[])Session["RefineSelection"];
     if (serRefine[4].ToString() != "")
     {
         string Finalsids = "";
         string[] sids = serRefine[4].Split(',');
         for (int j = 0; j < sids.Length; j++)
         {
             if (sids[j].ToString() != hfSizeID.Value)
                 Finalsids += sids[j].ToString() + ",";
         }
         Finalsids += hfSizeID.Value;

         Finalsids = Finalsids.TrimEnd(',');
         serRefine[4] = Finalsids;
     }
     else
         serRefine[4] = hfSizeID.Value;

     lblSizeCount.Text = CommonManager.GetProductCountWithAll(serRefine);
}
for(int i=0;i
现在我明白了问题所在。您希望数组在每次迭代时都处于初始状态。但事实并非如此,因为它是引用类型,您正在循环中修改它。下面是一个简化的示例,用于重现这种行为:

string[] RefineSelection = new[] {"A", "B", "C", "D", "E" };
for (int i = 1; i <= 3; i++)
{
    string[] serRefine = RefineSelection;  // you're not creating a copy but you're referencing the session-array
    string hfSizeID = "foo" + i;
    Console.WriteLine(string.Join(",", RefineSelection));
    serRefine[4] = hfSizeID;
    Console.WriteLine(string.Join(",", RefineSelection));
}
因此,在更改之前,将使用上一次迭代中的“foo”值。如前所述,这是因为数组是引用类型,变量的作用域不是循环本身,所以使用相同的引用

您可以从
会话
阵列创建克隆:

for (int i = 0; i < rep.Count; i++)
{
    string[] copy = (string[])RefineSelection.Clone();
    string hfSizeID = "foo" + i;
    Console.WriteLine(string.Join(",", copy));
    copy[4] = hfSizeID;
    Console.WriteLine(string.Join(",", copy));
}

这段代码有什么问题?猜猜看:您正在对
Page\u Load
中的
repatter
进行数据绑定,甚至在回发时也会导致它丢失所有更改的值。使用
页面的
IsPostBack
-属性。但是我的数组值来自session@PurveshDesai:(如果这是对我评论的回答)但您正在抱怨从hiddenfield设置的serRefine[4]
旧值。是的,但应该在下一个循环中。serRefine[4]将从会话中重置
for (int i = 0; i < rep.Count; i++)
{
    string[] copy = (string[])RefineSelection.Clone();
    string hfSizeID = "foo" + i;
    Console.WriteLine(string.Join(",", copy));
    copy[4] = hfSizeID;
    Console.WriteLine(string.Join(",", copy));
}
A,B,C,D,E
A,B,C,D,foo0
A,B,C,D,E
A,B,C,D,foo1
A,B,C,D,E
A,B,C,D,foo2