2012-03-21 88 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