1
我正在構建由非常自定義的語言驅動的自定義資源提供程序。爲了做到這一點,我必須從自定義表達式創建樹數據結構。讓我解釋一下:C#解析自定義分層表達式 - 構建樹
f1(f2,f3,f6(f4),f5)
上面是我的自定義表達式的例子,我想從中構建樹。根 - f1
,有子女:f2
,f3
,f4
,f5
。但f4
也有它自己的孩子。
我已經爲這個問題寫了解決方案,但我想找到更好的方法來實現這個目標。
class Node
{
public string val;
public List<Node> child = new List<Node>();
}
private Node parseInput(string input, int index)
{
string nodeName = findToken(input,ref index);
Node tmp = new Node() { val = nodeName };
tmp.child = expandNodes(input, ref index);
return tmp;
}
private List<Node> expandNodes(string input, ref int index)
{
List<Node> res = new List<Node>();
while (!char.IsLetterOrDigit(input[index++]) && index < input.Length) ;
index--;
while (index < input.Length)
{
if (checkNext(input, index, ')'))
{
while (!char.IsLetterOrDigit(input[index++]) && index < input.Length) ;
index--;
return res;
}
Node tmp = new Node() { val = findToken(input,ref index) };
if (checkNext(input, index, '('))
{
tmp.child = expandNodes(input, ref index);
}
res.Add(tmp);
}
return res;
}
private bool checkNext(string s, int index, char desiredChar)
{
string vc = "" + s[index];
while (index < s.Length && !char.IsLetterOrDigit(s[index]))
{
char chr = s[index];
if (chr == desiredChar)
{
return true;
}
index++;
}
return false;
}
private string findToken(string s, ref int index)
{
string res = null;
while (!char.IsLetterOrDigit(s[index++]) && index < s.Length) ;
index--;
while (index < s.Length && char.IsLetterOrDigit(s[index]))
{
res += s[index];
index++;
}
return res;
}
你在尋找什麼樣的「更好的方法」? –
更高效,更優雅的算法 – Kyniek