C# for 循环 - 如何使用不同的变量运行循环体?

APr*_*nce 6 c# loops for-loop

我有几个 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)


Fla*_*ter 6

数组和列表

每当您处理带有编号后缀的变量时,十有八九应该使用数组或列表。所以而不是:

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

我将跳过完整的介绍(您可以在网上找到教程),但 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 方法的细节,但我强烈建议您在您选择的知识库中查找它,因为它是一个强大的工具,可以极大地简化任何集合杂耍,否则您将不得不手动写出.