2012-03-21 41 views
0

我有四个长度相等的数组 我在foreach循环中使用这些数组。我正在使用四个变量(i,j,k,l)来增加和继续我需要FOREACH循环的代码或四个变量的循环

我在四个嵌套循环内编写我的代码,当i = 0,j = 0,k = ,0,1 = 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++; 

       } 

      } 
+0

这是很多/四。 – AHungerArtist 2012-03-21 14:00:06

+0

你能至少指定(和标记)这应该是什么语言? – hroptatyr 2012-03-21 14:03:45

+0

标签为C#,因为这是它看起来像... OP请更正,如果没有。 – Simon 2012-03-21 14:08:13

回答

0

我认为,在这种情况下,一个DataTable将优于4个阵列,并且需要算法将是微不足道的这样的数据结构。

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

0

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

编辑:

首先,你需要检查什么的集合拥有至少项(因为你不能点到为止)......我不知道类型的这事(你没不提供他们),所以让我们假设他们有一个计数属性。

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

我不知道类型的打印,所以我“M假设它们具有toString方法的一个计数属性

+0

使用linq提供一个exapmle – user1169809 2012-03-21 14:36:07

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语句。


UPDATE(响应您的编辑):

解决方法很简单,只使用一个索引变量,只有一个for -loop,而不是很多foreach -loops

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声明。)

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; 

希望这就是你要找的,LOL。 ..

+0

+1 – 2012-03-21 16:40:21