Разделить строку на массив, затем цикл, в C # - PullRequest
1 голос
/ 05 января 2012

Я прогуглил это много, но мои навыки C # довольно ужасны, и я просто не понимаю, почему это не работает.

У меня есть строка, полученная из объекта сеанса, который я не могу контролировать. Строка содержит несколько предложений, разделенных шестью подчеркиваниями. e.g.:

Sentence number one______Sentence number two______Sentence number three etc

Я хочу разделить эту строку на шесть подчеркиваний и вернуть каждый элемент в результирующий массив.

Вот код, который у меня есть:

string itemsPlanner = HttpContext.Current.Session["itemsPlanner"].ToString();

string[] arrItemsPlanner = itemsPlanner.Split(new string[] { "______" }, StringSplitOptions.None);

foreach (string i in arrItemsPlanner)
{
  newItemsPlanner += "debug1: " + i;  //This returns what looks like a number, as I'd expect, starting at zero and iterating by one each loop.
  int itemNumber;

  try
  {
    itemNumber = Convert.ToInt32(i);
    string sentence = arrItemsPlanner[itemNumber].ToString();
  }
  catch (FormatException e)
  {
    return "Input string is not a sequence of digits.";
  }
  catch (OverflowException e)
  {
    return "The number cannot fit in an Int32.";
  }
  finally 
  {
    return "Fail!"
  }
}

Всякий раз, когда я запускаю это, сеанс успешно восстанавливается, но строка, которая говорит: itemNumber = Convert.ToInt32 (i); каждый раз происходит сбой, и я получаю сообщение об ошибке «Входная строка не является последовательностью цифр».

Может кто-нибудь указать мне правильное направление с этим, пожалуйста?

Большое спасибо!

Ответы [ 7 ]

4 голосов
/ 05 января 2012

в вашем случае i это не число, это фактический элемент в массиве. Цикл foreach не имеет итерационной переменной, у вас есть доступ только к фактическому элементу, который повторяется через i.

Итак, первый цикл цикла i: Предложение номер один , затем Предложение номер два .

Если вы хотите число, вместо этого вы должны использовать цикл for.

Так что-то вроде этого

for( int i = 0; i < arrItemsPlanner.length; i++ ){
  //on first iteration here
  //i is 0
  //and arrItemsPlanner[i] id "Sentence number one"
}

Надеюсь, это поможет.

3 голосов
/ 05 января 2012

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

string itemsPlanner = HttpContext.Current.Session["itemsPlanner"].ToString(); 
string[] arrItemsPlanner = itemsPlanner.Split("______"); 

foreach (string i in arrItemsPlanner) 
{ 
  // Do something with each sentence
}

Вы можете разбить строку и символ (или символ []).В foreach 'i' будет значением предложения, поэтому вы можете объединить его, обработать или сделать что-либо еще:)

Если я неправильно понял, мои извинения.Я надеюсь, что это помогает:)

1 голос
/ 05 января 2012

В вашем примере кода foreach (string i in arrItemsPlanner) 'i' будет получать строковое значение arrItemsPlanner один за другим.Например, на первой итерации он будет иметь «Предложение номер один», которое явно не относится к категории vlid, следовательно, ваше преобразование не удалось.

1 голос
/ 05 января 2012

Вам нужно обрезать строку перед преобразованием в число?если это не так, вы можете использовать Int32.tryParse ()

1 голос
/ 05 января 2012

Пример из MSDN .

    string words = "This is a list of words______with a bit of punctuation" +
                   "______a tab character.";

    string [] split = words.Split(new Char [] {'_'}, StringSplitOptions.RemoveEmptyEntries);

    foreach (string s in split) {

        if (s.Trim() != "")
            Console.WriteLine(s);
    }
1 голос
/ 05 января 2012

В вашем примере i не содержит действительного целого числа, поэтому Convert.ToInt32 завершается ошибкой.Цикл foreach устанавливает i с текущим элементом в массиве предложений, поэтому в основном i всегда содержит одно из предложений в вашей основной строке.Если вы хотите, чтобы i был индексом в массиве, используйте цикл for.

0 голосов
/ 05 января 2012

i содержит только один фрагмент строки, который будет: number one Sentence number two и Sentence number three. Если вы хотите, чтобы он содержал int, представляющий индекс ht, используйте: 1) петля for 2) int, определенный перед вашим foreach, и увеличьте его (myInt ++) в коде foreach!

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