将LastIndexOf和Substring与数组一起使用

时间:2015-12-17 15:20:17

标签: c# arrays substring indexof

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

  

David Chalmers 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);
    }
}

任何帮助将不胜感激!

8 个答案:

答案 0 :(得分:3)

使用Split,它更容易:

String Test = "David Chalmers 34";

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

Console.WriteLine(Segments[2]);

Console.ReadKey();

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

答案 1 :(得分:1)

您必须从子字符串长度中减去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

答案 2 :(得分:1)

你的表达应该是:

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

您需要减去1而不是添加。

答案 3 :(得分:0)

你也可以在Linq的一行中完成所有这些:

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

答案 4 :(得分:0)

这是我要做的事情,使用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));
    }
}

答案 5 :(得分:0)

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

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

然后你可以转换为整数

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

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:-1)

使用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());
            }
        }
​