c# - 在 Linq 中发出对象 where 子句 : the condition is bypassed

标签 c# linq where-clause

大家好,

今天这是我在我最喜欢的 C# 帮助资源网站上发表的第一篇文章。我很高兴加入社区。

这是我的问题,我想在使用 .Where 子句过滤 double 值列表后调用 .Select linq 子句来创建结构列表,但过滤条件似乎没有被评估或者它们返回总是正确的。
请查看我的代码以很好地理解问题:

string[] msgNames = new string[] { "de", "vf", "ze", "ki", "vt", "er" };
double[] prevCounters = new double[] { 154.0, 24588.0, 4547.0, 788.0, 1455.0, 24577.0 };
double[] counters = new double[] { 8548.0, 54854.0, 54854.0, 44.0, 121.0, 48547.0 };
double[] lenValues = new double[] { 1.0, 2.0, 0.0, 4.0, 5.0, 0.0 };

BufferInfo[] positiveLenValues = counters
    .Where((c, it) => lenValues[it] >= 1.0 && prevCounters[it] != c)
    .Select((c, it) =>
    {
        prevCounters[it] = c;

        return new BufferInfo()
        {
            Name = msgNames[it],
            Length = lenValues[it]
        };
    }).ToArray();

也许我误解了 linq 的用法,但最后返回的 BufferInfo[] 包含所有值,而 lenValues 数组中有一些值小于 1.0。有关此代码块没有并发访问的信息。linq block 上的局部变量通常是动态实例化的(由来自 National Instruments 的外部程序集重新调整),它在这里只是为了让您知道。

例如,相同的行为但带有 for 循环,同样有效:

List<BufferInfo> myInfos = new List<BufferInfo>();

for (int i = 0; i < 6; i++)
{
    if (lenValues[i] >= 1.0 && prevCounters[i] != counters[i])
    {
        oldCounters[i] = counters[i];
        myInfos.Add(new BufferInfo()
                    {
                        Length = lenValues[i],
                        Name = msgNames[i]
                    });
    }
}

BufferInfo[] buffers = myInfos.ToArray();

我不关心是否使用linq,我只是想了解它为什么会失败。
请解释为什么我会得到这些奇怪的结果。

最好的问候,
伦@ir。

最佳答案

嗯,那是因为你的 .Select((c, it) => 再次从 0 开始它的索引......

因此,如果您的 Where 子句过滤项目并仅返回 4 个项目,您的 Select 将使用索引 0, 1, 2, 3与您使用 Where 返回的项目的索引不对应。

关于c# - 在 Linq 中发出对象 where 子句 : the condition is bypassed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15298786/

相关文章:

c# - Azure 中同时使用 ASP.NET + PHP

mysql - 如何在 SQL Select 中设置部分 LIMIT

ruby-on-rails-3 - 如何对ActiveRecord中的同一列执行多个where语句?

c# - 如何对引发异常的方法中收到的调用进行单元测试

c# - 处理所有已注册的服务?

C# - 子类中的自定义构造函数

c# - 如何在循环中使用 linq?

c# - LINQ中的SQL语句转换

javascript - AngularJS 搜索名称并计算重复项

php - 当我使用 php 包含 WHERE 时,从 sql 中读取停止