我在循环中使用列表时遇到问题,如果你们中的任何人能帮助我,我感激不尽。 我想创建一个列表并从数组(在我的代码中命名:sarray)填充它,其值大于-999。但问题是当值小于-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.0944 31411.0207 31411.0625 31499.07 31411.075 31411.0825 -999 -999 -999 -999 -999 -999 -999 -999 -999 -999 -999 31499.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]
答案 0 :(得分: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
答案 1 :(得分:4)
通用列表在其中一个overloaded constructors中使用了一个枚举,您可以使用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的项目,因此只要数据集保持不变,此检查就足够了。
答案 2 :(得分:1)
使用此:
List<double> nums = new List<double>(sarray.Where(x => x > -999));
答案 3 :(得分:1)
这样的东西可以工作,而不必自己迭代:
List<double> nums = (from value in sarray
where (value > -999) select value).ToList<double>();