是否有像“继续”这样的东西来绕过或跳过LINQ中的查询迭代

本文关键字:LINQ 迭代 查询 继续 是否 | 更新日期: 2023-09-27 18:18:05

举个例子:

        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循环之后?

我的问题只是一个例子来说明我的意思。所以我想知道做这样的事情的方法,不管被链接到什么类型的对象!

是否有像“继续”这样的东西来绕过或跳过LINQ中的查询迭代

一般来说,简单的解决方案是更多的where条件,因为where子句是根据定义导致LINQ跳过迭代的:

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

你可以使用。distinct()并创建你自己的IEqualityComparer,它根据在你的例子中'equals'的含义来比较对象。

那么,对于你原来的例子:

class PairSetEqualityComparer : IEqualityComparer<Tuple<int, int>>
    {
        public bool Equals(Tuple<int, int> x, Tuple<int, int> y)
        {
            return (x.Item1 == y.Item1 && x.Item2 == y.Item2) ||
                   (x.Item1 == y.Item2 && x.Item2 == y.Item1);
        }
        public int GetHashCode(Tuple<int, int> obj)
        {
            return obj.Item1*obj.Item2;
        }
    } 

你可以这样使用:

var queryResult =
            (from qRes1 in queryValues1
            from qRes2 in queryValues2
            where qRes1 * qRes2 == 12
            select new Tuple<int, int>(qRes1, qRes2)).Distinct(new PairSetEqualityComparer());

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

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