как получить доступ к массиву строк вне цикла - PullRequest
3 голосов
/ 17 марта 2009
for (int z = 0; z < alParmValues.Count; z++)
{
   //string[] def;
   string[] asd = alParmValues[z].ToString().Split(',');//this is of type string.collections and u cant cast it to a arraylist or array 
   //if (HUTT.clsParameterValues.bCustomObj == false)

   string[] def = alMethSign[z].ToString().Substring(alMethSign[z].ToString().IndexOf('(') + 1, alMethSign[z].ToString().IndexOf(')') - (alMethSign[z].ToString().IndexOf('(') + 1)).Split(',');
}

Мне нужно получить доступ к обоим массивам строк вне цикла. Есть ли лучшее решение для этого? Я не могу использовать ArrayList или объявить их как публичные, так как я могу получить к ним доступ?

Ответы [ 4 ]

7 голосов
/ 17 марта 2009

Чтобы получить доступ к чему-либо вне цикла, просто объявите это вне цикла, а затем поработайте с ним после завершения обработки цикла:

string[] arr = ...

for (int z = 0; z < alParmValues.Count; z++)
{
  // work with arr...
}

var item = arr[3]; // Accessed outside of loop.

Однако в вашем коде, похоже, что-то не так. Я бы порекомендовал немного больше подумать о теле цикла и о том, что вы там пытаетесь сделать. Рассмотрим эту строку, например:

for (int z = 0; z < alParmValues.Count; z++)
{
  // ...
  string[] asd = alParmValues[z].ToString().Split(',');

  // There aren't any more references to asd after this point in the loop,
  //   so this assignment serves no purpose and only keeps its last assigned
  //   value.
}

Это задание бессмысленно; каждый раз, когда вы проходите цикл, вы просто перезаписываете предыдущее значение asd и никогда не используете его позже в цикле.

2 голосов
/ 17 марта 2009

Область действия asd и def ограничена телом цикла for. Если вам нужно получить к ним доступ, вам нужно объявить их вне цикла. Есть проблема в их выпуске?

Взгляните на Учебное пособие по классам коллекций на MSDN.

0 голосов
/ 17 марта 2009

Сначала, если вы хотите получить доступ к данным, извлеченным / вычисленным внутри цикла, вы должны объявить контейнер для результатов вне цикла, а затем заполнить его значения внутри цикл.

Во-вторых, не думайте о приведении массивов, возвращенных методом split, а скорее думайте о обработке их содержимого .

Предполагая, что вы хотите объединить результаты из всех элементов исходного массива alParmValues в одну пару результатов, я бы использовал что-то вроде следующего псевдокода. Конечно, вам нужно будет заполнить тип для ваших элементов alParmValues и alMethSign, добавить точки с запятой и т. Д. (Поскольку ваш вопрос не объясняет содержание и взаимосвязи между двумя массивами, обрабатываемыми в вашем цикле, Я просто рассмотрел их независимо.) Это не полный код, а просто набросок, с которого можно начать:

ArrayList allValues = new ArrayList()
foreach (??? parameter in alParmValues) {
    foreach (String value in parameter.ToString().Split(',')) {
        allValues.add(value)
    }
}

ArrayList allMethSignValues = new ArrayList()
foreach (??? methSign in alMethSign) {
    String thisString = methSign.toString()
    int open = thisString.indexOf('(')
    int close = thisString.indexOf(')')
    String parenPart = thisString.substring(open + 1, close - open - 1)
    foreach (String value in parenPart.split(',')) {
        allMethSignValues.add(value)
    }
}
0 голосов
/ 17 марта 2009

И 'asd', и 'def' являются строковыми массивами, область действия которых ограничена циклом for. Вы не можете получить к ним доступ вне цикла. Если вы хотите сделать это, попробуйте объявить их вне цикла for.

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