C#:字符串分为子字符串,不包括标签

时间:2017-02-25 16:36:49

标签: c# arrays string substring

我有一个看起来像这样的文件:



0   4   5
6   9   9




等,每行有三个数字,用制表符分隔。我有一个来自文件的行数组:



string[] lines = File.ReadAllLines(theFile);




对于每一行,我调用一个函数,其结果是返回一个整数数组。以下是我的代码现在的样子:



 public int[] getPoint(string line)
    {
        int xlength= line.IndexOf(" "); //find location of first white space
        int x= Int32.Parse(line.Substring(0, xlength)); //find x-coordinate and turn it from a string to an int

        int ylength = line.IndexOf(" ", xlength); //find next white space
        int y = Int32.Parse(line.Substring(xlength + 1, ylength)); //y-coordinate starts after first white space and ends before next

        int z = Int32.Parse(line.Substring(ylength + 1, line.Length)); //z starts after 2nd white space and goes through end of line
        
        return new int[] { x, y, z }; //return a new point!
    }




我的问题在于IndexOf(字符串)函数。它无法识别标签。我怎么能写这个,以便每个我的getPoint功能实现其目的?谢谢。

4 个答案:

答案 0 :(得分:1)

尝试将IndexOf()与标签一起使用,而不是使用空格:

int xlength= line.IndexOf("\t"); //"\t" - to find tabs

此外,请在每次"\t"来电中使用IndexOf()

答案 1 :(得分:0)

如何使用Split和Linq以及LinqPad

void Main()
{
    var lines = new List<string> { "0\t4   5", "6\t9\t9" };

    lines.Select(l => GetPoint(l)).Dump();
}

static int[] GetPoint(string s)
{
    var values = s.Split(new[] {' ', '\t'}, StringSplitOptions.RemoveEmptyEntries);

    return values.Select(v => int.Parse(v)).ToArray();
}

当然你会用

File.ReadLines("path").Select(l => GetPoint(l)).Dump();

答案 2 :(得分:0)

请尝试使用ReadLines方法。 RealLines将按要求逐行读取文件。另外,请尝试使用Split方法。如果找到的字符串不能解析为int,我还会添加错误处理。以下是一些指导您的代码,但您可能需要根据自己的需要进行调整:

foreach (var thisLine in File.ReadLines(theFile))
{
    int[] point = getPoint(thisLine);
}

public int[] getPoint(string line)
{
    // Split by tab or space
    string[] portions = line.Split(new char[] { ' ', '\t' });

    int x = Int32.Parse(portions[0]); //find x-coordinate and turn it from a string to an int

    int y = Int32.Parse(portions[1]); //y-coordinate starts after first white space and ends before next

    int z = Int32.Parse(portions[2]); //z starts after 2nd white space and goes through end of line

    return new int[] { x, y, z }; //return a new point!
}

答案 3 :(得分:0)

要为上述建议添加一些额外容量,您可以使用Regex.Matches(),如下所示:

        string line = "1\t-25\t5";

        var numbers = Regex.Matches(line, @"-?\d+");
        foreach (var number in numbers)
            Console.WriteLine(number);

然后将这些数字解析为整数。

这有两个好处。

  1. 它可以处理负数,
  2. 即使标签未被使用或不可靠,它也会成功提取数字。