我有几个 double 类型的变量,例如它们的名称如下:Hight1、Hight2、Hight3、Hight4……这些值没有顺序,可以到处都是,但变量都是按时间顺序编号的。
现在我想访问这些变量的值并运行一些代码直到满足某些条件。例如:
bool Result = false;
if (0,3 + Hight1 >= 2)
{
Result = true;
}
else
{
if (0,3 + Hight2 >= 2)
{
Result = true;
}
else
...
Run Code Online (Sandbox Code Playgroud)
现在我对编码非常陌生并且完全自学,我刚刚发现了 for 循环,并想为此创建一个循环,因为这可能会持续数十个变量,并且可能会占用数百行代码,这非常难看。 ..所以我想做这样的事情:
bool result = false
for (int i = 1; result!; i++)
{
if (0,3 + ("Hight" + i) >= 2)
{
result = true;
}
}
Run Code Online (Sandbox Code Playgroud)
所以在第一轮循环应该使用 Hight1,在第二轮 Hight2 等等,直到满足某些条件或者我们已经运行了所有变量。
我只是不知道如何编码。我研究了反射器和数组,但只找到了如何为这些按时间顺序编号的变量赋予某些值+i 的示例,但没有找到如何按时间顺序访问它们的示例。
非常感谢。
Mar*_*čič 11
制作Height一个数组。
像这样的东西:
var result = false;
decimal[] height = { 0.1, 0.2 }; // use your values here
for (var ii = 0; ii < height.Length; ii++) {
if (0.3 + height[ii] > 2) {
result = true;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
每当您处理带有编号后缀的变量时,十有八九应该使用数组或列表。所以而不是:
float height1 = 0.1;
float height2 = 1.8;
Run Code Online (Sandbox Code Playgroud)
你做:
float[] heights = new float[] { 0.1, 1.8 };
//OR
List<float> heights = new List<float>() { 0.1, 1.8 };
Run Code Online (Sandbox Code Playgroud)
这允许您使用循环来处理数组/列表的所有元素:
for(int i = 0; i < heights.Length; i++) // use heights.Count for a List<float>
{
// do something with heights[i]
}
Run Code Online (Sandbox Code Playgroud)
请注意,为了处理集合的每个元素,您可以改为使用 a foreach,这意味着您不必手动调整索引值:
foreach(var height in heights)
{
// do something with height
}
Run Code Online (Sandbox Code Playgroud)
您也可以在此处使用 LINQ,我将对此进行介绍。
我不确定你为什么这样做:
0.3 + height >= 2
Run Code Online (Sandbox Code Playgroud)
而不是更有意义的:
height >= 1.7
Run Code Online (Sandbox Code Playgroud)
在某些情况下,写出计算是有意义的(例如,以毫秒为单位表示时间跨度时),但这似乎不是这些情况之一。
不过,这只是一个有根据的猜测,我不知道在您的情况下将 2 和 0.3 明确表示为数字是否有意义(这取决于您的域)。然而,在假设 1.7 同样有意义的情况下,答案将继续。如果不是,那么您可以将原始评估替换回提供的代码示例中。
每当您处理这种形状的逻辑时:
if( a == b )
{
myBoolean = true;
}
else
{
myBoolean = false;
}
Run Code Online (Sandbox Code Playgroud)
这总是可以简化为:
myBoolean = (a == b);
Run Code Online (Sandbox Code Playgroud)
你的逻辑略有不同,因为你有一个后备评估,但同样的原则在这里适用,给你:
result = (height1 >= 1.7) || (height2 >= 1.7);
Run Code Online (Sandbox Code Playgroud)
resulttrue仅当其中一个高度为 1.7 或更高时才会出现。
话虽如此,如果您开始使用数组,则不再需要此逻辑,但无论如何我想指出它,因为它显着提高了可读性,并且这是您应该提高以成为更好的开发人员的基本技能。
我将跳过完整的介绍(您可以在网上找到教程),但 LINQ 为您所做的基本上是为您提供预制的循环函数,这些函数对集合的每个元素(列表/数组)执行特定操作。
这实际上是您在这里想要的:您想检查数组/列表中的每个高度,并且您想知道这些高度中的任何一个是否通过了特定检查(即>= 1.7)。
我突出显示any是因为此处调用了适当的 LINQ 方法Any()。它接受一个描述需要执行的评估的 lambda 方法,如果集合中至少有一个元素通过了这个评估,它会返回一个为真的布尔值。
您的整个代码块可以压缩为:
float[] heights = new float[] { 0.1, 1.8 }; // you could use the list as well here
var result = heights.Any(height => height >= 1.7);
Run Code Online (Sandbox Code Playgroud)
现在我想回顾一下我们在上一节中建立的优化逻辑。LINQ 的Any方法所做的基本上是相同的,只是它对集合中的每个元素重复计算。
如果您的集合包含两个元素,则Any基本上与以下内容相同:
var result = (heights[0] >= 1.7) || (heights[1] >= 1.7);
Run Code Online (Sandbox Code Playgroud)
如果您的集合包含 5 个元素,它的作用与:
var result = (heights[0] >= 1.7) || (heights[1] >= 1.7) || (heights[2] >= 1.7) || (heights[3] >= 1.7) || (heights[4] >= 1.7);
Run Code Online (Sandbox Code Playgroud)
这就是 LINQ(以及一般的循环)的强大之处:无论集合中有多少元素,您的代码都可以工作,因此您无需自己手动处理每个单独的元素。
这将为您节省大量的精力。
我不会深入研究 LINQ 和 lambda 方法的细节,但我强烈建议您在您选择的知识库中查找它,因为它是一个强大的工具,可以极大地简化任何集合杂耍,否则您将不得不手动写出.