编程语言
首页 > 编程语言> > C#-从字符串开头读取单个int的最简单方法

C#-从字符串开头读取单个int的最简单方法

作者:互联网

我有一个看起来像这样的输入字符串:

4 Bob 32 Joe 64 Sue 123 Bill 42

其中4表示要跟随的字符串整数对的数量.我当前的处理方式如下所示:

var strings = input.Split(' ');
int count = Int32.Parse(strings[0]);
for ( int i = 0; i < count; i++ )
{
  string name = strings[count*2 + 1];
  int number = Int32.Parse(strings[count*2 + 1]);
  ProcessPerson(name, number);
}

这感觉很麻烦. C#中是否有一些库可以包装字符串并为我提供“ readInt”和“ readString”之类的服务.我最终希望拥有这样的东西:

int count = input.ReadInt();
for(int i = 0; i<count; i++)
{
  ProcessPerson(input.ReadString(), input.ReadInt());
}

在这种情况下,看起来并没有太大的改进,但是我的实际对象模型要复杂一些.我知道其他语言也可以处理类似这样的事情,但是我想不起任何.net库只能从字符串的开头读取.

解决方法:

您可以轻松地自己编写这样的“库”:

class Parser
{
    private readonly Queue<string> m_parts;

    public Parser(string s)
    {
        m_parts = new Queue<string>(s.Split(' '));
    }

    public string ReadString()
    {
        return m_parts.Dequeue();
    }

    public int ReadInt32()
    {
        return int.Parse(ReadString());
    }
}

如果字符串可能很大,或者您正在从流中读取它,则必须自己进行拆分:

class StreamParser
{
    private readonly TextReader m_reader;

    public StreamParser(string s)
        : this(new StringReader(s))
    {}

    public StreamParser(TextReader reader)
    {
        m_reader = reader;
    }

    public string ReadString()
    {
        var result = new StringBuilder();
        int c = m_reader.Read();
        while (c != -1 && (char)c != ' ')
        {
            result.Append((char)c);
            c = m_reader.Read();
        }

        if (result.Length > 0)
            return result.ToString();

        return null;
    }

    public int ReadInt32()
    {
        return int.Parse(ReadString());
    }
}

标签:text-parsing,string,c,net
来源: https://codeday.me/bug/20191102/1991882.html