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)
使用已经给出的部分答案,我创建了一个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)
虽然这不是完全相同的基本概念,但您所寻找的内容可以使用以下 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[]