列表<>在循环中

时间:2012-06-12 14:59:40

标签: c# list loops

我在循环中使用列表时遇到问题,如果你们中的任何人能帮助我,我感激不尽。 我想创建一个列表并从数组(在我的代码中命名: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]

4 个答案:

答案 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>();
相关问题