我在循环中使用list有问题,我很感谢你们中的任何人能帮我。我希望创建一个列表,并使用大于-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.0649 31411.0895 31411.0944 31411.0207 31411.0683 31411.0717 31411.0825 -999 -999 -999 -999 -999 -999 -999 -999 -999 -999 -999-999 31411.0156 31411.0718 31411.0719 31411.0884 31411.0885 31411.0896 31411.0897 31411.0537 31411.066 31411.0631411.0631411.0701 31411.0701 31411.0731 31411.0752 31411.0716 31411.0776 31411.0803 31411.091 31411.1411.0911 31411.0919 31411.0919 31411.0919
发布于 2012-06-12 15:02:44
泛型列表在其过载构造器中接受一个可枚举的枚举,您可以使用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的项,因此只要数据集保持不变,此检查就足够了。
发布于 2012-06-12 15:07:14
您所描述的代码不会发生在您演示的代码中。它将将数组中所有大于-999的值从索引0添加到索引49。
如果数组大于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-12 15:04:42
用这个:
List<double> nums = new List<double>(sarray.Where(x => x > -999));https://stackoverflow.com/questions/10999315
复制相似问题