0

我在循环中使用列表时遇到问题,如果你们中的任何人可以帮助我,我将不胜感激。我想创建一个列表并从值大于-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 -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]

4

4 回答 4

6

您所描述的内容不会发生在您显示的代码中。它将数组中从索引 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
于 2012-06-12T15:07:14.070 回答
4

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

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

您声明它-999代表您的“空”值,在这种情况下,您可以将 更改Where为不假设有效值大于-999:

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

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

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


但问题是当值小于 -999

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

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

于 2012-06-12T15:02:44.507 回答
1

用这个:

List<double> nums = new List<double>(sarray.Where(x => x > -999));
于 2012-06-12T15:04:42.680 回答
1

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

List<double> nums = (from value in sarray 
                     where (value > -999) select value).ToList<double>();
于 2012-06-12T15:05:54.053 回答