C#没有Java那样好用的Scanner类。于是我在需要读入一堆数字的时候,我是这么写的:
1 2 3 4 string [] tempInput = Console.ReadLine().Split(new [] { ' ' }, StringSplitOptions.RemoveEmptyEntries); int a = int .Parse(tempInput[0 ]); int b = int .Parse(tempInput[1 ]);
于是做题的时候我觉得太麻烦了,就仿照Java的Scanner功能实现了一个Scanner类。然后根据需要增加了几个奇怪的函数。
以下是我的Scanner类: (注释采用了VS的智能感知标记,这样可以在使用这些方法时从补全框中看到方法描述等信息)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 class Scanner { Queue<string > buffer; public Scanner () {} public void Ignore () { buffer.Clear(); } protected void eat (string s ) { string [] tempInput = new Regex("(\s+)" ).Split(s); buffer = new Queue<string >(tempInput); buffer.Enqueue("" ); } public string NextLine () { if (buffer.Count == 0 ) return Console.ReadLine(); else { StringBuilder temp = new StringBuilder(); foreach (string k in buffer) { temp.Append(k); } buffer.Clear(); return temp.ToString(); } } public bool HasNext () { if (buffer==nullbuffer.Count == 0 ) { string s = Console.ReadLine(); if (s == null ) return false ; eat(s); } return true ; } public String Next () { HasNext(); string t = buffer.Dequeue(); buffer.Dequeue(); return t; } public int NextInt () { return int .Parse(Next()); } public long NextLong () { return long .Parse(Next()); } public double NextDouble () { return double .Parse(Next()); } public string [] NextArray () { return new Regex("\s+" ).Split(NextLine()); } public int [] NextIntArray () { string [] s=NextArray(); int [] n = new int [s.Length]; for (int i = 0 ; i < s.Length; i++) { n[i] = int .Parse(s[i]); } return n; } public long [] NextLongArray () { string [] s = NextArray(); long [] n = new long [s.Length]; for (int i = 0 ; i < s.Length; i++) { n[i] = long .Parse(s[i]); } return n; } public double [] NextDoubleArray () { string [] s = NextArray(); double [] n = new double [s.Length]; for (int i = 0 ; i < s.Length; i++) { n[i] = double .Parse(s[i]); } return n; } }
以下提供了一个snippet文件,在VS中,使用(工具->)代码段管理器导入这个文件之后,可以在代码中键入Scanner按两次Tab来插入这段代码。
https://github.com/zyzsdy/acm/blob/master/CSharp/Scanner.snippet
(请注意以上文件和上面的代码有一些微小的差异,使用上面的代码需要手动插入using System.Text.RegularExpressions;
一句。)
标准的用法是类似这样:
1 2 3 4 5 static Scanner cin = new Scanner(); static void Main (string [] args ) { cin.NextInt(); }