【发布时间】:2020-10-07 11:52:02
【问题描述】:
我从编程和 C# 开始,我有两个元组。一个元组代表一个点列表:
static List<(string, string, string)> PR { get; set; } = new List<(string, string, string)>()
{
("P1", "0", "0"),
("P2", "P1", "P1+Height"),
("P3", "P1+Width", "P2"),
("P4", "P3", "P3+Height")
};
其中,元组列表中的 Item1 代表点名称(P1、P2、P3、P4),Item2 和 Item3 分别代表点的 x 值和 y 值的参数公式。
上述列表中第二项中的“P1”应查找以“P1”开头的元组,然后查找该元组中的第二项,在本例中为 0。
我有第二个元组列表,表示计算上述点值所需的参数。
static List<(string, double)> PAR { get; set; } = new List<(string, double)>()
{
("Height", 500),
("Width", 1000)
};
假设我要计算参数公式“P3+Height”的值如下:
P3+Height --> P2 (+Height) --> P1+Height (+Height) --> 0 (+Height (+Height) --> 0 + Height + Height;
最后我想用实际值(0 + 500 + 500 -> P3+Height = 1000)替换参数字符串,但那是以后关心的。
问题:我正在尝试创建一个函数,它可以递归地评估元组列表并保留参数名称,但也会查找相应的元组,直到我们到达结束或退出情况。这就是我现在所处的位置,但我很难在实际工作代码中得到我的思考过程:
static void Main(string[] args)
{
//inputString = "P3+Height"
string inputString = PR[3].Item3;
string[] returnedString = GetParameterString(inputString);
#region READLINE
Console.ReadLine();
#endregion
}
private static string[] GetParameterString(string inputString)
{
string[] stringToEvaluate = SplitInputString(inputString);
for (int i = 0; i < stringToEvaluate.Length; i++)
{
//--EXIT CONDITION
if (stringToEvaluate[0] == "P1")
{
stringToEvaluate[i] = "0";
}
else
{
if (i % 2 == 0)
{
//Check if parameters[i] is point string
var value = PAR.Find(p => p.Item1.Equals(stringToEvaluate[i]));
//Check if parameters[i] is double string
if (double.TryParse(stringToEvaluate[i], out double result))
{
stringToEvaluate[i] = result.ToString();
}
else if (value == default)
{
//We have a point identifier
var relatingPR = PR.Find(val => val.Item1.Equals(stringToEvaluate[i])).Item2;
//stringToEvaluate[i] = PR.Find(val => val.Item1.Equals(pointId)).Item2;
stringToEvaluate = SearchParameterString(relatingPR);
}
else
{
//We have a parameter identifier
stringToEvaluate[i] = value.Item2.ToString();
}
}
}
}
return stringToEvaluate;
}
private static string[] SplitInputString(string inputString)
{
string[] splittedString;
splittedString = Regex.Split(inputString, Delimiters);
return splittedString;
}
谁能指出我如何通过递归或其他更好、更简单的方法来完成这项工作的正确方向?
最后,我需要得到一个这样的元组列表:
("P1", "0", "0"),
("P2", "0", "500"),
("P3", "1000", "500"),
("P4", "1000", "1000")
提前致谢!
【问题讨论】:
-
嘿。您尝试执行此操作的方式确实很复杂。为什么不使用定义元组一个条目的结构或类?
-
嗨,我认为您需要按照@AdrianEfford 的建议为代码添加更多结构,并且还需要使用链表或树来保存节点。这将简化问题。