我的意思是类似于 Linq join、group、distinct 等,只处理值序列,而不是集合。
序列和集合之间的区别在于,序列的长度可能是无限的,而集合是有限的。
让我给你举个例子:
var c1 = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var c2 = FunctionThatYieldsFibonacciNumbers();
var c3 = c1.Except(c2);
这不起作用。except 的实现在任何一个集合中的数字将严格升序或降序的基础上都不起作用,因此它首先尝试将第二个集合中的所有值收集到一个集合(或类似的集合)中,然后才会这样做开始枚举第一个集合。
假设上面的函数只是一个不会终止的 While 循环,除非您明确停止枚举它,那么上面的代码将因内存不足异常而失败。
但是,鉴于我的集合被认为是严格升序或降序的,.NET 4.0 中是否已经有任何实现可以做到:
- 给我所有共同的价值观(内部连接)
- 给我两者的所有值(联合/外部连接)
- 给我序列#1中所有不在序列#2中的值
我需要这种与我需要构建的调度系统相关的功能,我需要在其中执行以下操作:
c1 = 2010 年 1 月起每月的 1 号和 15 号 c2 = 2010 年及以后的工作日 c3 = 2010-2012 年的所有天数 c4 = c1 和 c2 和 c3
从 2010 年到 2012 年,这基本上会给我每个月的第 1 天和第 15 天,但前提是这些日期是在工作日。
有了这样的函数,生成有问题的值会容易得多,而无需明确地从它们中构建集合。在上面的示例中,构建前两个集合需要知道第三个集合的约束,并且示例可能变得比上面的复杂得多。