我需要FOREACH循环的代码或四个变量的循环

时间:2012-03-21 13:58:04

标签: c# foreach

我有四个长度相等的数组 我在foreach循环中使用这些数组。 我使用四个变量(i,j,k,l)来递增和继续

我在四个嵌套循环中编写代码,该代码应该在i = 0,j = 0,k =,0,l = 0时执行 I = 1,J = 1,K = 1,L = 1 I = 2,J = 2,K = 2,L = 2 .....(取决于数组长度)

请建议我这段所需的代码。

int i = 0, j = 0, k = 0, l = 0;
          foreach (string fieldName in splitFieldnames)
          {
              i = 0;
              foreach (string dataType in splitDatatypeNames)
              {
                  j = 0;
                  foreach (string controlName in SplitControlNames)
                  {
                      k = 0;
                      foreach (string controlType in splitControlTypeNames)
                      {
                          if (i == j && j == k && k == l)
                          {

                              if (controlType == "textbox" && dataType == "string")
                              {

                                  Response.Write("_Student." + fieldName + "= " + controlName + ".Text;");
                                  l++;
                                  break;
                              }

                          }
                          k++;

                      }

                      j++;
                  }



                  i++;

              }

          }

5 个答案:

答案 0 :(得分:1)

我认为使用LINQ可以为您节省大量手动编码:

static void Main(string[] args)
{
    var splitFieldnames = new string[] { "field1", "field2", "field3" };
    var splitDatatypeNames = new string[] { "datatype1", "string", "string" };
    var SplitControlNames = new string[] { "control1", "control2", "control3" };
    var splitControlTypeNames = new string[] { "combobox", "textbox", "textbox"};

    // this code can handle different sized arrays, but is based strictly
    // on the size of the splitFieldnames array as the base.
    var splitMerged = splitFieldnames.Select
        ((c, idx) =>
            new
            {
                fieldName = c,
                dataType = splitDatatypeNames.Length > idx ? 
                    splitDatatypeNames[idx] : "",
                controlName = SplitControlNames.Length > idx ? 
                    SplitControlNames[idx] : "",
                controlTypeName = splitControlTypeNames.Length > idx?
                    splitControlTypeNames[idx] : "",
            });

   foreach (var item in splitMerged
      .Where(c => c.controlTypeName == "textbox" && c.dataType == "string"))
   {
       Response.Write("_Student." + item.fieldName + "= " 
           + item.controlName + ".Text;");
   }

结果输出如下:

_Student.field2= control2.Text;
_Student.field3= control3.Text;

希望这就是你要找的东西,大声笑......

答案 1 :(得分:0)

我认为在这种情况下,DataTable会优于4个数组,并且您需要的算法对于这样的数据结构来说是微不足道的。

答案 2 :(得分:0)

如果您要完成的是处理四个数组中的相同索引,只需使用一个循环并使用计数器访问该循环中每个数组中的值:

foreach(string fieldName in SplitControlNames)
{
    dataType = splitDatatypeNames[arrayPosition];
    controlName = SplitControlNames[arrayPosition];
    controlType  = splitControlTypeNames[arrayPosition];

    if (controlType == "textbox" && dataType == "string")
        Response.Write("_Student." + fieldName + "= " + controlName + ".Text;");

    arrayPosition++;
}

或者,创建并填充其中包含四个值的结构(fieldName,dataType,controlName,controlType)并具有该结构的一个数组

答案 3 :(得分:0)

好的,这段代码非常简单。如果你只需要在i = j = k = l时显示数据,那么就不需要任何循环,甚至不需要i,j,k,l的存在。 如果你可以向我保证所有这些字符串在任何东西(一个集合?一个数组?一个字典?)被订购,是可以的。 如果它们是有序的,那么扔掉所有的每个,并且只需按位置访问每个具有最小值的集合中的控件。 如果没有订购所有这些集合,那么这完全是用途,因为它会在每次运行时产生不同的结果。 我会用一些代码编辑这个答案,一旦你能告诉我这是否有序。

编辑:

首先,你需要检查哪个集合的项目最少(因为你不能超越它)......我不知道这些东西的类型(你没有提供它们),所以我们假设他们有一个计数属性。

int minimun = splitFieldnames.count;
if (splitDatatypeNames.count < minimun)
    minimun = splitDatatypeNames.count;
if (SplitControlNames.count < minimun)
    minimun = SplitControlNames.count
if (splitControlTypeNames.count < minimun)
    minimun = splitControlTypeNames.count

一旦你有了最小值(因为你不能超越它),只需迭代它并打印你想要的任何东西

for (int i = 0; i < minimun;i++)
{
    if (splitControlTypeNames[i].tostring() == "textbox" && splitDatatypeNames[i].tostring() == "string")
        {
            //Response.Write("_Student." + fieldName + "= " + controlName + ".Text;");
            //Also, a parametric string would be better ;)
            string result = string.format("_Student.{0}= {1}.Text;",splitFieldnames[0].tostring(),SplitControlNames[0].tostring());
            Response.Write(result);
            l++;
        }
}

我不知道类型,所以我假设他们有一个tostring方法和一个count属性

答案 4 :(得分:0)

使用for代替foreach

for (int i = 0; i < splitFieldnames.Length; i++)
{
    string fieldName = splitFieldnames[i];
    for (int j = 0; j < splitDatatypeNames.Length; j++)
    { 
        string dataType = splitDatatypeNames[j];
        for (int k = 0; k < SplitControlNames.Length; k++)
        { 
            string controlName = SplitControlNames[k];
            for (int l = 0; l < splitControlTypeNames.Length; l++)
            {
                string controlType = splitControlTypeNames[l];
                if (i == j && j == k && k == l)
                { 
                    if (controlType == "textbox" && dataType == "string")
                    { 
                        Response.Write("_Student." + fieldName + "= " + controlName + ".Text;");
                        break;
                    }
                }
            }
        }
    }
}

另请注意break只会突破最内层的循环!请考虑使用return语句。


更新(响应您的编辑):

解决方案很简单,只使用一个索引变量,只使用一个for - 循环而不是大量foreach - 循环

for (int i = 0; i < splitFieldnames.Length; i++)
{
    if (splitControlTypeNames[i] == "textbox" && splitDatatypeNames[i] == "string")
    { 
        Response.Write("_Student." + splitFieldnames[i] + "= " + SplitControlNames[i] + ".Text;");
        break;
    }
}

(假设您想在第一场比赛后停止。如果您想输出所有字符串文本框,请删除break语句。)