2015-07-03 1 views
-1

я не знаю, как исправить эту ошибку во время выполнения:как исправить ошибку с подстроки и IndexOf C#

http://postimg.org/image/hh9vl7hi9/

Значение roomsInfo является: «@ 114 | МАГ | БИК | 1 || дан | БИК | 1 || \ 0" и аварии, когда значение: „дан | БИК | 1 || \ 0“ (во второй раз в то время), когда я пытаюсь сделать эту строку:

roomsInfo = roomsInfo.Substring(roomsInfo.IndexOf('|') + 1, roomsInfo.IndexOf('\0')); 

это полный код:

String roomsInfo = Program.sendToServ("@10||"); 
     String[] room_name = new String[100]; 
     String[] admin_name = new String[100]; 
     String[] number_of_people = new String[100]; 
     int check = 0, count = 0; 
     if(roomsInfo.IndexOf('\0') > 5) 
     { 
      roomsInfo = roomsInfo.Substring(roomsInfo.IndexOf('|')+1, roomsInfo.IndexOf('\0')); 
      while (roomsInfo[roomsInfo.IndexOf('|') + 2] != '\0' && roomsInfo[roomsInfo.IndexOf('|') + 1] != '\0') // @114|roomName1|RoomAdmin1|count1||roomName2|RoomAdmin2|count2|| 
      { 
       if (check == 0) 
       { 
        room_name[count] = roomsInfo.Substring(0, roomsInfo.IndexOf('|')); 
        check = 1; 
        roomsInfo = roomsInfo.Substring(roomsInfo.IndexOf('|') + 1, roomsInfo.IndexOf('\0')); 
       } 
       if (check == 1) 
       { 
        admin_name[count] = roomsInfo.Substring(0, roomsInfo.IndexOf('|')); 
        check = 2; 
        roomsInfo = roomsInfo.Substring(roomsInfo.IndexOf('|') + 1, roomsInfo.IndexOf('\0')); 
       } 
       if (check == 2) 
       { 
        number_of_people[count] = roomsInfo.Substring(0, roomsInfo.IndexOf('|')); 
        check = 0; 
        count++; 
        roomsInfo = roomsInfo.Substring(roomsInfo.IndexOf('|') + 2, roomsInfo.IndexOf('\0')); 
       } 

      } 
     } 

Спасибо! Nir

+1

Вам следует рассмотреть возможность начать с 'roomsInfo.Split ('|')' вместо 'roomsInfo.IndexOf ('|') 'он поместит каждую часть этой строки в массив, с которым вам будет легче работать. –

ответ

0

Для правильной подстроки Вы должны получить длину подстроки Так же, как при получении длины вектора в математике.

например, у вас есть две точки в одной строке. скажем, 5 и 13. Для того, чтобы получить длину от 5 до 13 вы должны вычесть 5 из 13 так 13 - 5 = 8

 int startIndex = roomsInfo.IndexOf('|') + 1; 
     int endIndex = roomsInfo.IndexOf('\0'); 
     int length = endIndex - startIndex; 

     roomsInfo = roomsInfo.Substring(startIndex, length); // Will Get nir|1|| 

Если вы хотите, чтобы получить последний символ тоже. вы должны добавить 1 в длину

 roomsInfo = roomsInfo.Substring(startIndex, length + 1); // Will Get nir|1||\0 

Из того, что я вижу в вашем коде. ваши подстроки - все неправильно. поэтому вы должны сделать это со всеми из них.

Одна линия решение

roomsInfo = roomsInfo.Substring(roomsInfo.IndexOf('|') + 1, roomsInfo.IndexOf('\0') - roomsInfo.IndexOf('|') - 1); 

Опять же, если вы хотите получить последний символ тоже необходимо добавить 1 к длине.

+0

То, что вы написали, не работает, потому что оно desappired the/0 (ваша последняя строка, которую вы написали, я положил в начало) – Nir

+0

, если вы добавите ее в длину, это займет ее. но заметим, что/0 - пустой символ. так что вы не можете увидеть его debug @ user3346907 –

0

Я предполагаю, что это может быть как-то связано с || между записями (является ли это разделителем записей, я предполагаю?) и индексированием подстроки.

Что Гленн говорит, будет работать, чтобы разбить запись на поля, но в вашем случае все ваши записи соединены вместе и (я предполагаю, что они ограничены ||?), А затем окончательно заканчивается нулевым нулем. Поэтому вам сначала нужно разбить вашу строку на множество записей, прежде чем разбить записи на поля.

struct RoomInfo 
    { 
    public String RoomName; 
    public String AdminName; 
    public String WhatIsNir; 
    public int NumberOfPeople; 
    } 

    var roomsInfo = new List<RoomInfo>(); 
    String allData = "@114|mag|nir|1||@115|dan|nir|1||\0".TrimEnd('\0'); 
    String[] delimiters = new string[] { "||" }; 
    String[] records = allData.Split(delimiters, StringSplitOptions.RemoveEmptyEntries); 

    foreach (var record in records) 
    { 
    String[] fields = record.Split('|'); 
    roomsInfo.Add(new RoomInfo 
     { 
     RoomName = fields[0], 
     AdminName = fields[1], 
     WhatIsNir = fields[2], 
     NumberOfPeople = int.Parse(fields[3]) 
     }); 
    } 

Другая проблема может заключаться в том, что ваши данные и ваши поля являются несоответствиями. То есть где ваши три поля повторяются в следующей строке? "@ 114 | маг | БИК | 1 || дан | NIR | 1 || \ 0". Я вижу четыре поля в этой строке, поэтому я добавил одно (название комнаты) в приведенном выше примере.

Конечно, для использования этого решения нужно сказать, что есть приверженность вашему формату данных. Если это то, что вы можете изменить (т. Е. Не определено сторонней стороной), я бы изменил его на нечто более стандартное. Даже базовая форма CSV будет аналогичной, но может быть и лучше.

0

Ваша реализация чрезвычайно сложна. Это можно сделать с помощью нескольких строк кода, который легче поддерживать:

string roomsInfo = Program.sendToServ("@10||"); 
    var room_name = new List<string>(); 
    var admin_name = new List<string>(); 
    var number_of_people = new List<string>(); 

    if(roomsInfo.IndexOf('\0') > 5) 
    { 
     roomsInfo = roomsInfo.Substring(roomsInfo.IndexOf('|')+1, roomsInfo.IndexOf('\0')); 
     var records = roomsInfo.Split(new[] {"||"}, StringSplitOptions.None); 
     foreach (var rec in records) 
     { 
      var fields = rec.Split(new [] {'|'}, StringSplitOptions.None); 
      room_name.Add(fields[0]); 
      admin_name.Add(fields[1]); 
      number_of_people.Add(fields[2]); 
     } 
    } 

Это может быть улучшено, конечно, для того, чтобы контролировать исключения.

Смежные вопросы