zoukankan      html  css  js  c++  java
  • Lua Table转C# Dictionary的方法示例[转载]

    table特性

    table是一个“关联数组”,数组的索引可以是数字或者是字符串,所有索引值都需要用 "["和"]" 括起来;如果是字符串,还可以去掉引号和中括号; 即如果没有[]括起,则认为是字符串索引

    table 的默认初始索引一般以 1 开始,如果不写索引,则索引就会被认为是数字,并按顺序自动从1往后编;

    table 的变量只是一个地址引用,对 table 的操作不会产生数据影响

    table 不会固定长度大小,有新数据插入时长度会自动增长

    table 里保存数据可以是任何类型,包括function和table;

    table所有元素之间,总是用逗号 "," 隔开;

    {
        1=0,
        2=0,
        3=0,
        4=2,
        5={},
        6=0,
        7={
            1=118,
            s010GameConfig={
                s008wPayType=0,
                s009wCostType=0,
                s015dwReservedRule3=3,
                s015dwReservedRule2=0,
                s006ClubId=0,
                s010wCostValue=0,
                s010wCellScore=1,
                s014wPlayCountRule=10,
                s013wHadPlayCount=0,
                s010dwPlayRule=0,
                s010wSubGameID=114,
                s009wMaxScore=0,
                s015dwReservedRule1=0,
                s015sPrivateTableID=0
            }
        }
    }

    新建一个项目,取了一个好听的名字SharpluaTable

    class SharpluaTable
     {
     string luatable = "";
     //从{开始解析
     //然后按等号分割,等号前后为一个键值对
     //逗号之后,为另一个键值对
     //如果遇到中途遇到{,一直解析到}为止,都为值
     Dictionary<string, string> dic = new Dictionary<string, string>();
     
     
     public Dictionary<string, string> Parse(string luatable)
     {
      this.luatable = luatable;
      //解析0位和最后一位,判断是否是luatable格式
     
      if (luatable[0] != '{')
      {
      throw new Exception("解析lua失败,格式错误");
      }
     
      if (luatable[luatable.Length - 1] != '}')
      {
      throw new Exception("解析lua失败,格式错误");
      }
      string luaKey = string.Empty, LuaValue = string.Empty;
      //标示解析Key还是Value,如果true,那么解析到Key里面,如果是false,那么解析到value里面
      bool iskey = true;
     
     
      for (int i = 1; i < luatable.Length; i++)
      {          //如果是最后一个键值对,那么直接就完了  if (i+1==luatable.Length&&luatable[i]=='}')  {   dic.Add(luaKey, LuaValue);   luaKey = string.Empty;   LuaValue = string.Empty;     break;  }
      //如果是逗号,那么存储当前的key value ,跳过当前字符解析
      if (luatable[i] == ',')
      {
       dic.Add(luaKey, LuaValue);
       luaKey = string.Empty;
       LuaValue = string.Empty;
       iskey = true; //跳过一个逗号,那么继续解析为key
       continue;
      }
      else
      {
       if (luatable[i] == '=')
       {
       iskey = false; //如果是等号,那么解析为key,并跳过当前
       continue;
       }
       //如果是二级的{,那么解析到}为止,并把当前的i的值移动到}的下标位置
       if (luatable[i] == '{')
       {
       //LuaValue += luatable[i];
       int kuohaoCount = 0;
       for (int j = i; j < luatable.Length; j++)
       {
        LuaValue += luatable[j];
        if (luatable[j]=='{')
        {
        kuohaoCount += 1;
        }
        if (luatable[j]=='}')
        {
        kuohaoCount -= 1;
     
        if (kuohaoCount==0)
        {
         i = j;
         break;
        }
        else
        {
         //kuohaoCount -= 1;
        }
        }
       }
       }
       else
       {
       if (iskey)
       {
        luaKey += luatable[i];
       }
       else
       {
        LuaValue += luatable[i];
       }
       }
      }
      }
      return dic;
     }

    目前前这个解析类只做了一层解析,如果value值有多层级,我默认把它解析到value里面

    如果有多层级的,那就再new一个SharpLuaTable对象,再进行一次解析就好了

    写这个的大佬已经提交到Nuget上了,有需要使用大兄弟可以直接命令

    Install-Package LuaTableToCSharp -Version 1.0.3

    【转载原文】:https://www.jb51.net/article/136104.htm

  • 相关阅读:
    Codeforces Round #599 (Div. 2) B2. Character Swap (Hard Version) 构造
    Codeforces Round #598 (Div. 3) F Equalizing Two Strings(构造题)
    codeforces round # 384 div2 B Chloe and the sequence 神奇二进制找规律题
    codeforces round #384 div2 C Vladik and fractions(构造)
    线段树板子
    Codeforces Round #616 (Div. 2) D (找规律题)
    codeforces round #616 div2 A (Even but not even)水题
    2017的计划清单
    回顾2016,我的简单总结
    关于ubuntu下sublime text 3 的安装和中文配置问题
  • 原文地址:https://www.cnblogs.com/strive-19970713/p/13661278.html
Copyright © 2011-2022 走看看