如何使用Substring和IndexOf修复错误c#

时间:2015-07-03 00:42:32

标签: c# string substring indexof

我不知道如何修复此运行时错误:

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

roomsInfo的值是:“@ 114 | mag | nir | 1 || dan | nir | 1 || \ 0” 当值为:“dan | nir | 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'));
                }

            }
        }

谢谢! 尼尔

3 个答案:

答案 0 :(得分:0)

为了正确地子串你必须获得子串的长度就像你在数学中得到Vector的长度一样。

例如,你在一行中有两个点。比如5和13.要获得5到13之间的长度,你必须从13减去5.所以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||

如果你想获得Last char。你必须加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长度。

答案 1 :(得分:0)

我猜这可能与||有关在记录之间(我记得是一个记录分隔符?)和你的子字符串索引。

Glenn所说的将把记录拆分成字段,但在你的情况下,你的所有记录都被链接在一起(我假设用||?分隔)然后最终以空零结束。因此,在将记录拆分为字段之前,首先需要将字符串拆分为一组记录。

  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])
      });
  }

另一个问题可能是您的数据和字段不匹配。即你的三个字段在下面的字符串中重复在哪里? &#34; @ 114 | MAG | NIR | 1 ||担| NIR | 1 || \ 0&#34 ;.我看到该字符串中有四个字段,所以我在上面的示例中添加了一个(房间名称)。

当然,使用此解决方案就是说您对数据格式有承诺。如果这是你能够改变的东西(即不是由第三方决定),那么我会把它改成更标准的东西。即使是CSV的基本形式也是类似的,但可能会更好。

答案 2 :(得分: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]);
        } 
    }

当然,这可以通过控制异常来改进。