如何修复 Substring 和 IndexOf c# 的错误

how to fix error with Substring and IndexOf c#

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

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

房间信息的值为:“@114|mag|nir|1||dan|nir|1||\0” 当值为:"dan|nir|1||[=23=]" 时崩溃 (第二次)当我尝试执行此行时:

roomsInfo = roomsInfo.Substring(roomsInfo.IndexOf('|') + 1, roomsInfo.IndexOf('[=10=]'));

这是完整代码:

    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('[=11=]') > 5)
        {
            roomsInfo = roomsInfo.Substring(roomsInfo.IndexOf('|')+1, roomsInfo.IndexOf('[=11=]'));
            while (roomsInfo[roomsInfo.IndexOf('|') + 2] != '[=11=]' && roomsInfo[roomsInfo.IndexOf('|') + 1] != '[=11=]') // @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('[=11=]'));
                }
                if (check == 1)
                {
                    admin_name[count] = roomsInfo.Substring(0, roomsInfo.IndexOf('|'));
                    check = 2;
                    roomsInfo = roomsInfo.Substring(roomsInfo.IndexOf('|') + 1, roomsInfo.IndexOf('[=11=]'));
                }
                if (check == 2)
                {
                    number_of_people[count] = roomsInfo.Substring(0, roomsInfo.IndexOf('|'));
                    check = 0;
                    count++;
                    roomsInfo = roomsInfo.Substring(roomsInfo.IndexOf('|') + 2, roomsInfo.IndexOf('[=11=]'));
                }

            }
        }

谢谢! 尼尔

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

例如,一条线上有两个点。比如说 5 和 13。要得到 5 到 13 之间的长度,你必须从 13 中减去 5。所以 13 - 5 = 8

        int startIndex = roomsInfo.IndexOf('|') + 1;
        int endIndex = roomsInfo.IndexOf('[=10=]');
        int length = endIndex - startIndex;

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

如果你也想得到最后一个字符。长度必须加 1

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

从我在你的代码中看到的。你的子字符串都是错误的。所以你必须对他们所有人都这样做。

一行解决

roomsInfo = roomsInfo.Substring(roomsInfo.IndexOf('|') + 1, roomsInfo.IndexOf('[=12=]') - roomsInfo.IndexOf('|') - 1);

同样,如果您也想获得最后一个字符,则必须将长度加 1。

我猜这可能与 || 有关记录之间(我假设是记录定界符?)和您的子字符串索引。

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||[=10=]".TrimEnd('[=10=]');
  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])
      });
  }

另一个问题可能是您的数据和字段不匹配。 IE。您的三个字段在以下字符串中的何处重复? “@114|mag|nir|1||dan|nir|1||\0”。我在该字符串中看到四个字段,因此我在上面的示例中添加了一个(房间名称)。

当然,使用这个解决方案就是说对你的数据格式有承诺。如果这是您可以更改的内容(即不是由第 3 方确定的),那么我会将其更改为更标准的内容。即使是 CSV 的基本形式也会类似,但可能会更好。

您的实施非常复杂。只需几行代码即可完成,更易于维护:

    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('[=10=]') > 5)
    {
        roomsInfo = roomsInfo.Substring(roomsInfo.IndexOf('|')+1, roomsInfo.IndexOf('[=10=]'));
        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]);
        } 
    }

这个当然可以改进,为了控制异常。