列表<>循环

本文关键字:循环 列表 | 更新日期: 2023-09-27 18:36:51

我在循环中使用列表时遇到问题,如果你们中的任何人可以帮助我,我将不胜感激。我想创建一个列表,并使用大于 -999 的值从数组(在我的代码中命名:sarray)填充它。但问题是当值小于 -999 时,代码会转储列表的前一项,并且大小不是 40,而是 27(好像创建了新列表列表)!

  List<double> nums = new List<double>();
        for (int i = 0; i < 50; i++)
        {
            if (sarray[i] > -999)
            {
                nums.Add(sarray[i]);
            }
        }

这些是值:

[31411.0857 31411.0902 31411.0847 31411.0858 31411.0859 31411.0479 31411.0649 31411.0895 31411.0944 31411.0207 31411.0683 31411.0717 31411.075 31411.0825 -999 -999 -999 -999 -999 -999 -999 -999 -999 31411.0156 31411.0718 31411.0719 31411.31411.0711.31411.31411.0711.31411.0711.31411.31411.0711.31411.31411.0711.31411.31411.0711.31411.9911.31411.0711.31411.0719 31411.31411.0711.31411.31411.0711.31411.31411.0711.31411.31411.0711.31411.0711.31411.0911.31411.0711.31411.31411.0711.31411.0911.31411.0711.31411.0919 31411.31411.0711.31411.0911.31411.0719 31411.31411.0911.31411.0711.31411.0911.31411.0911.31411.0711.31411.0911.31411.0911.31411.0911.31411.0711.31411.0911.31411.0911.31411.0911.31411.0911.31411.0711.0825 31411.0825 31411.0825 -90884 31411.0885 31411.0936 31411.0896 31411.0897 31411.0537 31411.066 31411.0661 31411.0556 31411.0701 31411.0731 31411.0952 31411.0716 31411.0776 31411.0803 31411.091 31411.0911 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919 31411.0919

31411.0919

列表<>循环

你所描述的内容不会发生在你显示的代码中。它将数组中从索引 0 到索引 49 的所有大于 -999 的值添加到列表中。

如果数组大于 50 个项目,则不会使用数组中的所有项目。您应该使用循环中数组的长度来获取所有项目:

for (int i = 0; i < sarray.Length; i++)

(即使您知道数组始终为 50 个项目,最好仍使用 Length 属性。这样,即使您将来更改数组的长度,数组也将始终使用整个数组。

编辑:

我用你的数据测试了你的代码,列表最后有 40 个项目。

double[] sarray = {
  31411.0857, 31411.0902, 31411.0847, 31411.0858, 31411.0859, 31411.0479,
  31411.0649, 31411.0895, 31411.0944, 31411.0207, 31411.0683, 31411.0717,
  31411.075, 31411.0825, -999, -999, -999, -999, -999, -999, -999, -999,
  -999, -999, 31411.0156, 31411.0718, 31411.0719, 31411.0884, 31411.0885,
  31411.0936, 31411.0896, 31411.0897, 31411.0537, 31411.066, 31411.0661,
  31411.0556, 31411.0701, 31411.0731, 31411.0952, 31411.0716, 31411.0776,
  31411.0803, 31411.091, 31411.0911, 31411.0919, 31411.0919, 31411.0919,
  31411.0919, 31411.0919, 31411.0919
};
List<double> nums = new List<double>();
for (int i = 0; i < 50; i++) {
  if (sarray[i] > -999) {
    nums.Add(sarray[i]);
  }
}
Console.WriteLine(nums.Count);

输出:

40

型列表在其重载构造函数之一中采用可枚举项,您可以使用 Linq Where 扩展方法来约束要添加的项:

var nums = new List<double>(sarray.Where(d => d > -999));

您声明-999为您表示"null"值,在这种情况下,您可以更改Where以不假设有效值大于 -999:

var nums = new List<double>(sarray.Where(d => d != -999));

我相信这种风格比制作自己的循环更清楚地表达了意图。

顺便说一句,double.NaN可能是无效值的更明显的表示形式。


但问题是当值小于 -999 时

这是因为您只检查值大于 -999 的位置:if (sarray[i] > -999)

但是,您提供的值转储没有任何小于 -999 的项目,因此只要数据集保持不变,此检查就足够了。

这样的东西可以工作,而不必迭代自己:

List<double> nums = (from value in sarray 
                     where (value > -999) select value).ToList<double>();

使用这个:

List<double> nums = new List<double>(sarray.Where(x => x > -999));