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

本文关键字:循环 四个 变量 代码 FOREACH | 更新日期: 2023-09-27 18:28:26

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

我在四个嵌套循环中编写代码,这些代码应该在I=0,j=0,k=,0,l=0时执行i=1,j=1,k=1,l=1i=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++;
              }
          }

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

我认为使用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;

我希望这就是你想要的,哈哈…

我认为在这种情况下,DataTable会比4个数组更好,对于这样的数据结构,您需要的算法将是微不足道的。

使用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语句。)

好吧,这段代码真的很简单。。如果你只需要在i=j=k=l时显示数据,那么就不需要任何循环,甚至不需要i,j,k,l的存在。如果你能向我保证,无论什么东西(集合、数组、字典?)中的所有字符串都是有序的,那没关系。如果它们是有序的,那么丢弃所有的for each,只需按集合中具有最小值的所有控件的位置访问每个控件。如果没有对所有这些集合进行排序,那么这是完全无用的,因为每次运行都会产生不同的结果。一旦你能告诉我这是不是订购的,我会用一些代码编辑这个答案。

编辑:

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

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方法和一个计数属性

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

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)的结构,并具有该结构的一个数组