设置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;
    }
}

我需要设置列表中每个令牌的NextPrevious属性,但避免它们指向NEWLINEWHITESPACETABSPACE令牌,但使用它们的下一个。

这是我的代码。

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;
    }
}

然而,它似乎不起作用。请帮忙好吗?

设置Next和Previous属性

我觉得我用了很多不必要的代码。谢谢@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();
    }
}