【问题标题】:How to use foreach for two lists with different length?如何将 foreach 用于两个不同长度的列表?
【发布时间】:2019-11-29 06:31:23
【问题描述】:

我有两个数字列表,第一个列表有 365 个数字,另一个有 8760。

我想先循环第一个列表并获取值。然后在第一个循环中,我想循环第二个列表,每次都得到 24 个数字。

对于下一次迭代,它将跳过前 24 个并获取下一个 24 个。

问题是每次打印时“countelev”似乎都没有改变并停留在“24”。应该改成48,72,96....

这是我的代码:

foreach (var dec in declinationangle)
{
    double declination = dec;
    double elev = Degreetoradian(declination);
    double lati = Degreetoradian(latitude);

    // Solar elevation angle, expressed as α, is the angular height of the
    //sun in the sky measured from the horizontal 0° at sunrise and 90° when
    //the sun is right overhead.
    //α = sin−1 (sin δ sin φ + cos δ cos φ cos τ)
    int countelev = 0;

    foreach (var hra in Solarhourangle.Skip(countelev).Take(24))
    {
        double hras = Degreetoradian(hra);
        double elev1 = Math.Sin(elev) * Math.Sin(lati);                    
        double elev2 = Math.Cos(elev) * Math.Cos(lati) * Math.Cos(hras);                                  
        double slav = Math.Asin(elev1 + elev2);
        double sla = Radiantodegree(slav);

        solarelevationangle.Add(sla);
    }

    countelev += 24;
    TaskDialog.Show("countelev", countelev.ToString());
}

【问题讨论】:

  • int countelev = 0 定义在foreach (var dec in declinationangle) 的范围内,每次都设置为0。将其移到第一个 foreach 块范围之外。
  • 我通过将 int count =0 放在 foreach 循环之外解决了这个问题。谢谢!
  • OT 你的内部foreach 将遍历整个列表,直到达到该计数值(然后再达到 24 个)。一个简单的for-loop 在索引上从 countelev 开始并在 24 之后结束(或者更快,如果达到终点)会更有效
  • @RoyLin 当回答对您有帮助时,通常会支持see here
  • "我想先循环第一个列表并获取值。"什么价值?一个具体的值,还是一个计算出来的值?请解释一下。

标签: c# list


【解决方案1】:

int countelev = 0;

此语句必须是您粘贴的块的第一条语句。表示该语句需要位于嵌套的 foreach 语句之外。

【讨论】:

    【解决方案2】:

    使用for 而不是foreach 要简单得多。您只需要一个循环,其索引可以遍历更大的数组。它可以通过将索引除以 24 并丢弃余数(方便地为 how integer division in c# works)从较小的数组中选择正确的元素。

    这是另一种思考方式。您不是从两个较小的列表中生成元素,而是从另外两个列表中填充目标列表中的元素——因为只有一个目标列表,所以您只需要一个循环.

    for (var i = 0; i< Solarhourangle.Count; i++)
    {
        hra = Solarhourangle[i];
        dec = declinationangle[i/24];  
    
        double elev = Degreetoradian(declination);
        double lati = Degreetoradian(latitude);
    
        double hras = Degreetoradian(hra);
        double elev1 = Math.Sin(elev) * Math.Sin(lati);                    
        double elev2 = Math.Cos(elev) * Math.Cos(lati) * Math.Cos(hras);                                  
        double slav = Math.Asin(elev1 + elev2);
        double sla = Radiantodegree(slav);
    
        solarelevationangle.Add(sla);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-15
      • 2021-02-25
      • 1970-01-01
      • 2023-01-22
      • 2017-11-30
      • 2017-12-24
      • 1970-01-01
      • 2021-01-26
      相关资源
      最近更新 更多