C# 从Linq查询中提取方法

C# 从Linq查询中提取方法,c#,.net,linq,anonymous-function,C#,.net,Linq,Anonymous Function,我有以下静态方法,它返回IEnumerable中所有可能的三元组组合,即勾股函数。例如:对于int[]数组={1,2,3,4,5},它将返回新的[]{{3,4,5},{4,3,5} 因此,为了消除重复,我试图以某种方式提取一个方法,该方法允许代码转换为如下内容: return OddMethod(array).SelectMany(c => GetTriplePermutations(a, b, c))); 现在,我不知道怎么做,因为我的代码的一部分是由Linq查询返回的。我在想这个 O

我有以下静态方法,它返回IEnumerable中所有可能的三元组组合,即勾股函数。例如:对于int[]数组={1,2,3,4,5},它将返回新的[]{{3,4,5},{4,3,5}

因此,为了消除重复,我试图以某种方式提取一个方法,该方法允许代码转换为如下内容:

return OddMethod(array).SelectMany(c => GetTriplePermutations(a, b, c)));
现在,我不知道怎么做,因为我的代码的一部分是由Linq查询返回的。我在想这个 OddMethod的签名应如下所示:

IEnumerable<IEnumerable<int>> OddMethod(int[] array)

,但不能再前进了。你知道我如何实现这种方法吗?谢谢

您总是可以定义一个扩展方法来覆盖您的逻辑并使代码更具可读性

阅读更多:

伪代码:

public static IEnumerable<IEnumerable<int>> GetTriplePermutations(tis IEnumerable<int> array)
{
    return array.SelectMany((a, i)).Skip(x + 1).SelectMany((b, j)).Skip(y + 1)
}


您可以使用OddMethodarray.GetTriplePermutations调用此函数

经过一些帮助,我终于找到了我一直在寻找的东西:

 public static IEnumerable<IEnumerable<int>> GetPythagoreanNumbers(IEnumerable<int> array)
        {
            ThrowNullException(array);

            return array.SelectSkip((a, inner) =>
                inner.SelectSkip((b, result) =>
                    result.SelectMany(c => GetTriplePermutations(a, b, c))));
        }

 private static IEnumerable<T> SelectSkip<T>(
            this IEnumerable<int> source,
            Func<int, IEnumerable<int>, IEnumerable<T>> func)
        {
            return source.SelectMany((a, i) =>
            {
                var inner = source.Skip(i + 1);
                return func(a, inner);
            });
        }

不过,我想我还是用老版本吧!:D

您可能会发现Eric Lippert的这篇文章很有用,谢谢!我会看看的谢谢!然而,这并不能解决我的问题,因为代码仍然会重复自身,但这次是在扩展方法中
public static IEnumerable<IEnumerable<int>> GetTriplePermutations(tis IEnumerable<int> array)
{
    return array.SelectMany((a, i)).Skip(x + 1).SelectMany((b, j)).Skip(y + 1)
}

 public static IEnumerable<IEnumerable<int>> GetPythagoreanNumbers(IEnumerable<int> array)
        {
            ThrowNullException(array);

            return array.SelectSkip((a, inner) =>
                inner.SelectSkip((b, result) =>
                    result.SelectMany(c => GetTriplePermutations(a, b, c))));
        }

 private static IEnumerable<T> SelectSkip<T>(
            this IEnumerable<int> source,
            Func<int, IEnumerable<int>, IEnumerable<T>> func)
        {
            return source.SelectMany((a, i) =>
            {
                var inner = source.Skip(i + 1);
                return func(a, inner);
            });
        }