【问题标题】:Using LastIndexOf and Substring with an array将 LastIndexOf 和 Substring 与数组一起使用
【发布时间】:2016-03-24 03:02:50
【问题描述】:

基本上,我从一个文本文件中读取 50 行,每行的格式有点像这样:

大卫查默斯 34

我已经使用ReadAllLines 读取了文本文件,因此每一行都应该是数组中的不同条目。

我正在尝试从每一行中获取数字并将它们存储到自己的数组中。现在我得到了错误:

索引和长度必须引用字符串中的位置。

static void getResults(string[] Text)
{
    // X = lastIndexOf for ' ' (space)
    // x will take position of the last space
    // Results = substring
    // z will be the length of the string
    // z = text.Length
    //  Substring (x+1,z-x+1)

    int lines = 50;
    string[] Results = new string[lines];
    for (int i = 0; i < Text.Length; i++)
    {
        int x = Text[i].LastIndexOf(' ');
        int z = Text[i].Length;

        Results[lines] = Text[i].Substring(x + 1, z - x + 1);
    }
}

任何帮助将不胜感激!

【问题讨论】:

  • 当您收到此错误时,您是否使用了调试器并检查了您的变量?
  • Results[50] 将不在数组中 - 大概你想要Results[i]
  • 您是否意识到您总是在数组中的同一位置写入(行数=50)?并且该位置不存在,因为 NET 中的数组从零开始并以长度结束 - 1(这里最多 49)?
  • 不应该是z - (x + 1)还是z - x - 1
  • 我不知道你为什么不使用string.Split() 方法来做到这一点,如果你得到超过50行的话,它会更有效,代码更少......至少@987654328只要文件格式保持不变,@函数仍然可以工作..

标签: c# arrays substring indexof


【解决方案1】:

使用Split,简单很多:

String Test = "David Chalmers 34";

String[] Segments = Test.Split(' ');

Console.WriteLine(Segments[2]);

Console.ReadKey();

当然,您需要为错误输入添加错误处理。

【讨论】:

    【解决方案2】:

    您必须从子字符串长度中减去 1 而不是添加它:

    var line = "David Chalmers 34";
    var lineLength = line.Length; // == 17
    var lastSpacePosition = line.LastIndexOf(' '); // == 14
    var age = line.Substring(lastSpacePosition + 1, lineLength - lastSpacePosition - 1); // == 34
    

    【讨论】:

      【解决方案3】:

      你的表达应该是:

      Results[lines] = Text[i].Substring(x + 1, z - x - 1);
      

      你需要减去 1 而不是加。

      【讨论】:

        【解决方案4】:

        您也可以在一行 Linq 中完成所有这些操作:

        var Results = Text.Take(50)
            .Select(line => line.Split(' '))
            .Select(sa => sa.Last())
            .ToArray();
        

        【讨论】:

          【解决方案5】:

          这就是我要做的,使用Person 类。鉴于您的项目范围,现在似乎没有必要,但如果范围扩大,使用类和实例将获得回报。另外,这样一来,您的姓名就可以与您正在寻找的年龄相匹配,这在某些时候可能是必要的。

          public static List<Person> GetResults(string[] text)
          {
              var results = new List<Person>();
          
              foreach(var line in text)
              {
                  results.Add(Person.Parse(line));
              }
          
              return results;
          }
          
          public class Person
          {
              public string Name { get; private set; }
              public int Age { get; private set; }
          
              public Person(string name, int age)
              {
                  Name = name;
                  Age = age;
              }
          
              public static Person Parse(string fromInputLine)
              {
                  ValidateInput(fromInputLine);
                  var delimPosition = fromInputLine.LastIndexOf(' ');
                  var name = fromInputLine.Substring(0, delimPosition);
                  var age = Convert.ToInt32(fromInputLine.Substring(delimPosition + 1));
                  return new Person(name, age);
              }
          
              private static void ValidateInput(string toValidate)
              {
                  if (!System.Text.RegularExpressions.Regex.IsMatch(toValidate, @"^.+\s+\d+$")) 
                      throw new ArgumentException(string.Format(@"The provided input ""{0}"" is not valid.", toValidate));
              }
          }
          

          【讨论】:

            【解决方案6】:

            你可以使用字符串类的.Split方法,他所做的就是用空格分隔字符串,然后你得到一个字符串数组......

            var entry = "David Chambers 34";
            string[] result = entry.Split(" ")
            

            然后你可以转换为整数

            var age = Convert.ToInt32(result[2]);
            

            var age = Int32.TryParse(result[2]);
            

            【讨论】:

              【解决方案7】:

              要将数字存储在自己的数组中,您可以尝试:

              string[] numbers = text.Select(x => x.Substring(x.LastIndexOf(' '))).ToArray();
              

              【讨论】:

                【解决方案8】:

                使用 StringReader

                        static void getResults(string Text)
                        {
                
                            // X = lastIndexOf for ' ' (space)
                            // x will take position of the last space
                            // Results = substring
                            // z will be the length of the string
                            // z = text.Length
                            //  Substring (x+1,z-x+1)
                
                            StringReader reader = new StringReader(Text);
                
                            List<string> Results = new List<string>();
                            string inputLine = "";
                            while ((inputLine = reader.ReadLine()) != null)
                            {
                                Results.Add(inputLine.Trim());
                            }
                        }
                ​
                

                【讨论】:

                • 这不符合 OP 的要求(仅获取数字)。
                • 是的:“每行的数字并将它们存储到自己的数组中”。该人没有说要将数字解析为整数。
                • 您将返回整行,而不仅仅是要求的数字部分:Results.Add(inputLine.Trim());(而且您的方法参数也错误,应该是string[] 而不是string)。
                • 我认为 string[] 是错误的。获取数组将转换为字符数组而不是字符串数组。
                猜你喜欢
                • 2012-11-16
                • 1970-01-01
                • 2016-08-15
                • 2018-08-17
                • 2017-03-19
                • 2015-10-05
                • 1970-01-01
                • 2023-04-06
                • 1970-01-01
                相关资源
                最近更新 更多