标记器/拆分为c#?

标记器/拆分为c#?,c#,java,split,tokenize,C#,Java,Split,Tokenize,我正在尝试将它从java转换为C#,除了标记器之外,我已经完成了几乎所有的工作。我知道你在C#中使用了split,但我似乎无法理解。程序需要将用户输入的公式(4/5+3/4)拆分为不带括号的格式。任何帮助都会很好 // read in values for object 3 Console.Write("Enter the expression (like 2/3 + 3/4 or 3 - 1/2): "); string line = Console.ReadLine(); // Works

我正在尝试将它从java转换为C#,除了标记器之外,我已经完成了几乎所有的工作。我知道你在C#中使用了split,但我似乎无法理解。程序需要将用户输入的公式(4/5+3/4)拆分为不带括号的格式。任何帮助都会很好

// read in values for object 3
Console.Write("Enter the expression (like 2/3 + 3/4 or 3 - 1/2): ");
string line = Console.ReadLine();

// Works with positives and neagative values!
// Split equation into first number/fraction, operator, second number/fraction
StringTokenizer st = new StringTokenizer(line, " ");
string first = st.nextToken();
char op = (st.nextToken()).charAt(0);
string second = st.nextToken();
稍后我将需要symbol(+、-、*、或/),并需要检查它是否是一个整数,这是我在代码中紧跟其后所做的。下面是我已经尝试过的,但我被这个字符卡住了

char delimeters = ' ';
string[] tokens = line.Split(delimeters);
string first = tokens[0];
char c = tokens[1]

tokens
是一个字符串数组,因此token[1]是一个字符串,您不能将字符串分配给字符。这就是为什么javacode是写在charAt(0)中的原因。将其转换为C#会产生


Java的等价物

String first = st.nextToken();
char op = (st.nextToken()).charAt(0);
String second = st.nextToken();
会是

string first = tokens[0];
char c = tokens[1][0];
string second = tokens[2];
很可能,您需要在循环中执行此操作。第一个将被读取一次,然后在有更多数据可用时,您将读取
运算符
操作数
,如下所示:

List<string> operands = new List<string> {tokens[0]};
List<char> operators = new List<char>();
for (int i = 1 ; i+1 < tokens.Length ; i += 2) {
    operators.Add(tokens[i][0]);
    operands.Add(tokens[i+1]);
}
List操作数=新列表{tokens[0]};
列表运算符=新列表();
for(inti=1;i+1
在这个循环之后,
运算符
将包含表示运算符的
N
字符,
操作数
将包含表示操作数的
N+1
字符串。

。。。但你来了

//您应该以以下内容结束
//令牌[0]是第一个值,在您的示例中为2/3或3
//在您的示例中,tokens[1]是+或-操作
//令牌[2]是第二个值,在您的示例中为3/4或1/2
煤焦测定仪=“”;
string[]tokens=line.Split(delimeters);
字符fractionDelimiter='/';
//获取第一个操作数
字符串优先=令牌[0];
bool result=int.TryParse(第一个,全部输出);
双操作数1=0;
//如果这只是一小部分,我们还有更多的工作。。。
//我们需要在“/”上再次分开
如果(结果){
操作数1=(双)整数;
}否则{
//假设这是一个分数
字符串fractionParts=first.Split(fractionDelimiter);
字符串分子=分形部分[0];
字符串分母=fractionParts[1];
操作数1=int.Parse(分子)/int.Parse(分母);
}
//获取第二个操作数
字符串秒=令牌[2];
bool secondResult=int.TryParse(第二,out secondfull);
双操作数2=0;
如果(第二个结果){
操作数2=(双)次整数;
}否则{
//假设这是一个分数
字符串secondFractionParts=second.Split(fractionDelimiter);
字符串secondNumerator=secondFractionParts[0];
字符串secondDenominator=secondFractionParts[1];
操作数2=int.Parse(第二分子)/int.Parse(第二分母);
}

剩下的事情应该很简单,比如找出运算是什么,然后用操作数1和操作数2进行操作

我不确定我是否理解你的问题,但我认为应该是
char c=tokens[1][0]
我不确定这是否可行?如果我需要清除任何内容,请告诉我。顺便说一句,如果您要使用float.Parse,请注意本地化。()尝试将操作数拆分为字符串数组时,操作数不会导致错误吗?这就是我所困惑的。??这就是为什么我先扔了一个锥虫。如果TryParse成功,则不需要拆分,并且将设置“out”值。如果TryParse没有成功(返回false),那么我们可以推断我们有一个斜杠,需要拆分。
List<string> operands = new List<string> {tokens[0]};
List<char> operators = new List<char>();
for (int i = 1 ; i+1 < tokens.Length ; i += 2) {
    operators.Add(tokens[i][0]);
    operands.Add(tokens[i+1]);
}