【发布时间】:2020-10-08 18:47:22
【问题描述】:
我尝试编写一个方法,给定一个 int Enumerable 和一个 int 变量(我们称之为 n),它生成所有总和小于 n 的子序列。
事情是这样的:
public static IEnumerable<IEnumerable<int>> SubSWithSumSmallerThanN(this IEnumerable<int> intEnum, int n)
{
var numbers = intEnum.ToList();
return Enumerable
.Range(1, numbers.Count)
.SelectMany(length => Enumerable.Range(0, numbers.Count - length + 1)
.Select(x => numbers.TakeWhile(y => numbers.IndexOf(y) > x && numbers.IndexOf(y) < x + length)))
.Where(x => x.Sum() <= n)
.ToArray();
}
基本上,这是行不通的。举个简单的例子,比如
{1, 5, 3, 8}, n = 7
而结果应该是
{{1}, {5}, {3}, {1, 5}}
实际结果是这样的:
Expected: List<IEnumerable<Int32>> [[1], [5], [3], [1, 5]]
Actual: IEnumerable`1[] []
它生成一个大部分为空的 IEnumerable。我该如何解决?
【问题讨论】:
-
你调试了吗?我害怕想到你的算法的复杂性是什么,所有这些
IndexOfs(加上当你有重复的数字时它会停止工作) -
为什么预期结果中不存在 {1,3}?
-
因为它不是一个序列。要获得 {1, 3},您必须跳过 5。
标签: c# linq ienumerable