2009-06-09 148 views
4

我想编写一个返回两个对象流的LINQ查询。在F#中,我会编写一个Seq表达式,它创建一个2元组的IEnumerable,然后运行Seq.unzip。 C#(在.NET 3.5上)这样做的正确机制是什么?从LINQ查询返回多个流

干杯,尤尔根

+0

hackish的解决方案:http://stackoverflow.com/questions/15690478 – 2013-03-28 19:51:54

回答

3

您最好的选择可能是创建一个Pair<T1, T2>类型和返回的一个序列。 (或使用匿名类型做同样的事情。)

然后,您可以“解压缩”它:

var firstElements = pairs.Select(pair => pair.First); 
var secondElements = pairs.Select(pair => pair.Second); 

这可能是值得物化pairs第一,但(如拨打ToList()你的第一个结束查询)以避免两次评估查询。

基本上这与您的F#方法完全相同,但没有内置支持。

+0

如果枚举是昂贵的计算或无限的,那么你将需要一个更复杂的解决方案,以避免双重物化比ToList输入。使用队列来缓存未迭代输出的结果的分区实现可以实现。 – 2013-08-20 12:21:47

2

由于C#中缺少元组,您可以创建一个匿名类型。 语义这是:

someEnumerable.Select(inst => new { AnonTypeFirstStream = inst.FieldA, AnonTypeSecondStream = inst.FieldB });

你不是在流的返回量势必这种方式,可以在现场只需添加到匿名类型非常像,你可以将元素添加到一个元组。

+0

System.Tuple在C#中可用。 – 2013-08-20 12:18:44