C# 从Linq查询中提取方法
我有以下静态方法,它返回IEnumerable中所有可能的三元组组合,即勾股函数。例如:对于int[]数组={1,2,3,4,5},它将返回新的[]{{3,4,5},{4,3,5} 因此,为了消除重复,我试图以某种方式提取一个方法,该方法允许代码转换为如下内容: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
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);
});
}