你可以在非表达式linq中压缩或使用自定义连接运算符吗?

时间:2011-02-01 23:22:30

标签: linq join

我想要以更易读的方式压缩多个序列,以便我可以写

a.Zip(b)

在查询语法中为

From a in Foo1
Join b in Foo2

没有结果是交叉连接

From a in Foo1
Zip b in Foo2

1 个答案:

答案 0 :(得分:3)

标准Zip方法允许您编写类似(使用C#)的内容:

from t in first.Zip(second, (f, s) => new { First = f, Second = s }
select ... t.First ... t.Second;

我认为这应该足够可读。您的问题似乎表明您希望能够创建自己的关键字,例如zip并使用它扩展C#查询表达式。这在C#或Visual Basic中是不可能的(但我同意它在某种程度上会很好)。

通过一些努力,您可以重新定义标准C#查询构造的功能,以便join的行为类似于zip(在这种情况下,equals不需要部分查询,因此你会有很多语法噪音)。可能,您还可以重新定义from条款。我没有尝试过,但我相信你可以得到类似的东西:

from f in first.Zip()
from s in second.AddToZip()
from t in second.AddToZip()
select ... f ... s ... t ...;

我写了一篇文章,介绍如何为group by子句(Using custom grouping operator in LINQ)执行重新定义,这样可以让您了解如何做到这一点。

(但老实说,我认为标准Zip方法应该没问题。运算符的重新定义非常微妙。group by示例可能更具吸引力,因为使用方法分组更加丑陋,甚至在边缘......)