设置Next和Previous属性
本文关键字:属性 Previous Next 设置 | 更新日期: 2023-09-27 18:10:08
我有一个由tokenizer生成的令牌列表。
List<Token> tokenList = new List<Token>();
这是令牌类
public class Token
{
public Tokens TokenName { get; set; }
public string TokenValue { get; set; }
public Token Previous {
get; set;
}
public Token Next {
get; set;
}
public Token(Tokens name, string value)
{
TokenName = name;
TokenValue = value;
}
}
我需要设置列表中每个令牌的Next
和Previous
属性,但避免它们指向NEWLINE
或WHITESPACE
或TABSPACE
令牌,但使用它们的下一个。
这是我的代码。
Token token = null;
foreach (Token tkn in tokenList)
{
if (token != null)
{
switch (token.TokenName)
{
case Tokens.NEWLINE:
case Tokens.WHITESPACE:
case Tokens.TABSPACE:
break;
default:
switch (tkn.TokenName)
{
case Tokens.NEWLINE:
case Tokens.WHITESPACE:
case Tokens.TABSPACE:
break;
default:
tkn.Previous = token;
token.Next = tkn;
token = tkn;
break;
}
break;
}
}
else
{
token = tkn;
}
}
然而,它似乎不起作用。请帮忙好吗?
我觉得我用了很多不必要的代码。谢谢@Lee,我已经使用了调试器。设置断点表明很多代码并不是简单地执行。这是我的工作代码。
Token token = null;
foreach (Token tkn in tokenList)
{
switch (tkn.TokenName)
{
case Tokens.NEWLINE:
case Tokens.WHITESPACE:
case Tokens.TABSPACE:
break;
default:
tkn.Previous = token;
if (token != null)
token.Next = tkn;
token = tkn;
break;
}
}
希望这能解决你的问题。请检查
class Program
{
public enum TokenName { NEWLINE, WHITESPACE, TABSPACE, A, B, C};
public class Token
{
public TokenName TokenName { get; set; }
public string TokenValue { get; set; }
public Token Previous
{
get;
set;
}
public Token Next
{
get;
set;
}
public Token(TokenName name, string value)
{
TokenName = name;
TokenValue = value;
}
}
static void Main(string[] args)
{
int count = 0, j=0;
Token tkn = null;
List<Token> tokenList = new List<Token>();
tokenList.Add(new Token(TokenName.NEWLINE, "7"));
tokenList.Add(new Token(TokenName.A, "1"));
tokenList.Add(new Token(TokenName.B, "2"));
tokenList.Add(new Token(TokenName.TABSPACE, "5"));
tokenList.Add(new Token(TokenName.C, "3"));
tokenList.Add(new Token(TokenName.WHITESPACE, "8"));
foreach (Token tken in tokenList)
{
Console.WriteLine(tken.TokenName.ToString() +" "+ tken.TokenValue.ToString());
}
for(int i=0; i<tokenList.Count; i++)
{
switch (tokenList[i].TokenName)
{
case TokenName.NEWLINE:
case TokenName.TABSPACE:
case TokenName.WHITESPACE: break;
default:
count++;
if (tkn == null)
{
tkn = tokenList[i];
j=i;
}
if (count > 1)
{
tokenList[i].Previous = tkn;
tkn.Next = tokenList[i];
tkn = tokenList[i];
count++;
}
break;
}
}
tkn = tokenList[j];
do
{
Console.WriteLine(tkn.TokenName.ToString() +" "+ tkn.TokenValue.ToString());
tkn = tkn.Next;
}
while (tkn != null);
Console.ReadLine();
}
}