【发布时间】:2015-05-07 18:06:34
【问题描述】:
有没有办法将下面的代码 sn-p 转换为使用 for 循环而不是大量使用 LINQ?
public static IEnumerable<IEnumerable<T>> Combinations<T>(this IEnumerable<T> elements, int k)
{
return k == 0
? new[] {new T[0]}
: elements.SelectMany((e, i) =>
elements.Skip(i + 1).Combinations(k - 1).Select(c => (new[] {e}).Concat(c)));
}
我们的目标是想出给定元素列表大小为 k 的所有可能组合。
【问题讨论】:
-
是的,有办法。毕竟,LINQ 的东西解析为循环。你是在问“路是什么?”您是否考虑过分解每个 LINQ 方法调用?
-
感谢您的回答!是的,如果有办法,我想知道如何,因为我对 LINQ 不是很熟悉。我尝试了几件事,但无法获得相同的结果...
-
这个问题已经从算法的角度解决了here。另请注意,删除 linq 不会提高组合算法的运行时间,因为它们都往往非常慢。
-
快速的 Google 搜索显示 dotnetgeek.tumblr.com/post/5205119053/…,看起来它可以满足您的需求。
-
@JamesC.TaylorIV 好吧,提供的解决方案效率极低,因为它一次又一次地重新计算相同的值。重写它留下了很大的改进空间。现在,即使是一个很好的实现,扩展性也很差,但它很容易比现在更有效。
标签: c# algorithm linq recursion combinations