【问题标题】:Lists<> in loop循环中的列表<>
【发布时间】:2012-06-12 14:59:40
【问题描述】:

我在循环中使用 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.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.091 31411.0911.0911.091.0919 31411.0919191931411.091919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919性性小酷盐

【问题讨论】:

  • 请展示一个简短但完整的程序来演示问题。
  • 不太明白您面临的问题,看来27 来自sarray 的数字是&gt; -999。记住 -998 大于 -999
  • sarray 中的值是什么?
  • 好吧,剩下的呢?您可以发布值吗?请记住,您可以编辑您的问题。
  • @Amir,我将其移至您的问题中,请删除您的最后一条评论。

标签: c# list loops


【解决方案1】:

您所描述的内容不会发生在您显示的代码中。它将数组中从索引 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

【讨论】:

  • 这太疯狂了!它在我创建新代码时起作用。但是当我在原始代码中使用相同的东西时,它又给了我 27!我觉得有bug!我很抱歉!
【解决方案2】:

通用列表在其overloaded constructors 之一中采用可枚举,您可以使用Linq Where 扩展方法来约束要添加的项目:

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] &gt; -999)

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

【讨论】:

  • 我相信他只想将某些项目添加到列表中(虽然不是我的反对意见)
  • @EricJ。已修改,直接进入代码并快速浏览了简介lol
  • @EricJ。在这种情况下,反对者应该再次摇摆并像你一样具有建设性 - 现在我完全有效的答案被错误地反对了。希望我们有能力@downvoters 大声笑
  • @KirkWoll 我很快就修好了,你仍然可以删除你的反对票。是的,我知道它已经坏了,这就是我把评论写下来的原因 - 希望路人在假设一个被拒绝的项目需要更多的反对之前阅读内容。
  • 伙计们感谢您的帮助。我真的很感谢你的好意:)
【解决方案3】:

类似这样的工作,无需自己迭代:

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

【讨论】:

  • 澄清一下,这个确实迭代sarray,它只是为你做。
  • @AdamHouldsworth 你说得对,用词不当,显然任何解决方案都会迭代sarray
【解决方案4】:

使用这个:

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

【讨论】:

    猜你喜欢
    • 2016-08-01
    • 1970-01-01
    • 2012-12-04
    • 2021-11-25
    • 2021-02-24
    • 2021-12-20
    • 2019-09-12
    • 2020-05-29
    • 2022-01-22
    相关资源
    最近更新 更多