是否有类似`continue`的东西绕过或跳过LINQ中的查询迭代?

时间:2011-12-18 01:44:30

标签: c# linq

举个例子:

        int[] queryValues1 = new int[10] {0,1,2,3,4,5,6,7,8,9};
        int[] queryValues2 = new int[100]; // this is 0 to 100

        for (int i = 0; i < queryValues2.Length; i++)
        {
            queryValues2[i] = i;
        }

        var queryResult =
            from qRes1 in queryValues1
            from qRes2 in queryValues2
            where qRes1 * qRes2 == 12
            select new { qRes1, qRes2 };

        foreach (var result in queryResult)
        {
            textBox1.Text += result.qRes1 + " * " + result.qRes2 + " = 12" + Environment.NewLine;
        }

显然,此代码将导致:

1 * 12 = 12
2 * 6 = 12
3 * 4 = 12
4 * 3 = 12
6 * 2 = 12

但我需要的只是前3行。那是我不想要2 * 6 = 12,查询检查6 * 2是否也是12 。有没有办法在LINQ查询中对此进行过滤,或者之后我必须在foreach循环中进行此操作?

我的问题只是展示我的意思的样本。所以我想知道做这种事情的方式,无论对象的类型是什么!

2 个答案:

答案 0 :(得分:4)

一般来说,简单的解决方案是 more where conditions ,因为where子句是定义导致LINQ跳过迭代:

var queryResult =
    from qRes1 in queryValues1
    from qRes2 in queryValues1
    where qRes1 * qRes2 == 12
    && qRes1 <= Math.Sqrt(12)
    select new { qRes1, qRes2 };

答案 1 :(得分:0)

TakeWhile(condition):只要指定的条件为真,就返回序列中的元素,然后跳过剩余的元素。

foreach (var result in queryResult.TakeWhile(x => x.qRes1 <= Math.Sqrt(12)))