C#中的Scanner类是否等同于字符串?

mmc*_*ole 32 c# java string java.util.scanner

在Java中,我可以通过一个扫描一个字符串,然后我可以做的得心应手之类的东西,scanner.hasNext()或者scanner.nextInt(),scanner.nextDouble()等.

这允许一些非常干净的代码来解析包含数字行的字符串.

这是如何在C#中完成的?

如果你有一个字符串说:

"0 0 1 22 39 0 0 1 2 33 33"
Run Code Online (Sandbox Code Playgroud)

在Java中,我会将其传递给扫描仪并执行操作

while(scanner.hasNext()) 
    myArray[i++] = scanner.nextInt();
Run Code Online (Sandbox Code Playgroud)

或者非常相似的东西.什么是C#'这样做的方法?

Blu*_*kMN 24

我将把它作为一个单独的答案添加,因为它与我已经给出的答案截然不同.以下是如何开始创建自己的Scanner类:

class Scanner : System.IO.StringReader
{
  string currentWord;

  public Scanner(string source) : base(source)
  {
     readNextWord();
  }

  private void readNextWord()
  {
     System.Text.StringBuilder sb = new StringBuilder();
     char nextChar;
     int next;
     do
     {
        next = this.Read();
        if (next < 0)
           break;
        nextChar = (char)next;
        if (char.IsWhiteSpace(nextChar))
           break;
        sb.Append(nextChar);
     } while (true);
     while((this.Peek() >= 0) && (char.IsWhiteSpace((char)this.Peek())))
        this.Read();
     if (sb.Length > 0)
        currentWord = sb.ToString();
     else
        currentWord = null;
  }

  public bool hasNextInt()
  {
     if (currentWord == null)
        return false;
     int dummy;
     return int.TryParse(currentWord, out dummy);
  }

  public int nextInt()
  {
     try
     {
        return int.Parse(currentWord);
     }
     finally
     {
        readNextWord();
     }
  }

  public bool hasNextDouble()
  {
     if (currentWord == null)
        return false;
     double dummy;
     return double.TryParse(currentWord, out dummy);
  }

  public double nextDouble()
  {
     try
     {
        return double.Parse(currentWord);
     }
     finally
     {
        readNextWord();
     }
  }

  public bool hasNext()
  {
     return currentWord != null;
  }
}
Run Code Online (Sandbox Code Playgroud)


Den*_*nis 5

使用已经给出的部分答案,我创建了一个StringReader可以提取Enum和实现IConvertible.

用法

using(var reader = new PacketReader("1 23 ErrorOk StringValue 15.22")
{
     var index = reader.ReadNext<int>();
     var count = reader.ReadNext<int>();
     var result = reader.ReadNext<ErrorEnum>();
     var data = reader.ReadNext<string>();
     var responseTime = reader.ReadNext<double>();
}
Run Code Online (Sandbox Code Playgroud)

执行

public class PacketReader : StringReader
{
    public PacketReader(string s)
        : base(s)
    {
    }

    public T ReadNext<T>() where T : IConvertible
    {
        var sb = new StringBuilder();

        do
        {
            var current = Read();
            if (current < 0)
                break;

            sb.Append((char)current);

            var next = (char)Peek();
            if (char.IsWhiteSpace(next))
                break;

        } while (true);

        var value = sb.ToString();

        var type = typeof(T);
        if (type.IsEnum)
            return (T)Enum.Parse(type, value);

        return (T)((IConvertible)value).ToType(typeof(T), System.Globalization.CultureInfo.CurrentCulture);
    }

}
Run Code Online (Sandbox Code Playgroud)


Ada*_*son 3

虽然这不是完全相同的基本概念,但您所寻找的内容可以使用以下 lambda 表达式来完成:

string foo = "0 0 1 22 39 0 0 1 2 33 33";

int[] data = foo.Split(' ').Select(p => int.Parse(p)).ToArray();
Run Code Online (Sandbox Code Playgroud)

其作用首先是Split使用string空格作为分隔符。然后,该Select函数允许您为数组中的给定成员指定别名(在本例中我将其称为“ p”),然后对该成员执行操作以给出最终结果。然后,该ToArray()调用将这个抽象可枚举类转换为具体数组。

因此,最后,这会拆分string,然后将每个元素转换为 an并用结果值int填充 an 。int[]

  • 程序员调用它是因为他们想知道下一个标记是浮点数还是双精度数。也许您应该阅读 Scanner 的 Java 文档? (2认同)
  • 我不需要阅读 Java 文档...我不是 Java 开发人员,我是 C# 开发人员,在这里回答 C# 问题。我也没有兴趣与那些恶意挑衅的人争论。 (2认同)