Мне нужен код для цикла FOREACH или для цикла для четырех переменных - PullRequest
0 голосов
/ 21 марта 2012

у меня есть четыре массива равной длины Я использую эти массивы в циклах foreach. Я использую четыре переменные (i, j, k, l) для увеличения и продолжения

Я пишу свой код внутри четырех вложенных циклов, этот код должен выполняться, когда i = 0, j = 0, k =, 0, l = 0 = 1, J = 1, к = 1, L = 1 я = 2, J = 2, к = 2, л = 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 ]

1 голос
/ 21 марта 2012

Я думаю, что использование 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 голосов
/ 21 марта 2012

Используйте 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 -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.)

0 голосов
/ 21 марта 2012

Если вы пытаетесь выполнить один и тот же индекс в четырех массивах, просто используйте один цикл и используйте счетчик для доступа к значению в каждом массиве в этом одном цикле:

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 голосов
/ 21 марта 2012

Хорошо, этот код действительно прост .. Если вам нужно показать данные только тогда, когда i = j = k = l, то нет необходимости в каком-либо цикле или даже в существовании i, j, k, l.Если вы можете заверить меня, что все эти строки в какой-либо вещи (коллекция? Массив? Словарь?) Упорядочены, все в порядке.Если они упорядочены, то отбросьте все для каждого и просто получите доступ к каждому по позиции для всех элементов управления, которые есть в коллекции, имеющей минимальное значение.Если вся эта коллекция не упорядочена, то это полностью бесполезно, поскольку она будет давать разные результаты при каждом запуске.Я отредактирую эти ответы с помощью некоторого кода, как только вы сможете сказать мне, заказан ли он или нет.

РЕДАКТИРОВАТЬ:

Прежде всего, вам необходимо проверить, в какой коллекции меньше всего элементов (так как вы не можете выйти за рамки этого) ... Я не знаю типы этих вещей (вы их не предоставили), поэтому давайте предположим, что они имеют свойство 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 свойство count

0 голосов
/ 21 марта 2012

Я думаю, что в этом случае DataTable будет лучше, чем 4 массива, и требуемый вами алгоритм будет тривиальным с такой структурой данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...