【发布时间】:2009-06-09 11:53:10
【问题描述】:
我想编写一个返回两个对象流的 LINQ 查询。在 F# 中,我会编写一个 Seq 表达式,它创建一个 2-tuples 的 IEnumerable,然后运行 Seq.unzip。在 C#(在 .NET 3.5 上)中执行此操作的正确机制是什么?
干杯,尤尔根
【问题讨论】:
我想编写一个返回两个对象流的 LINQ 查询。在 F# 中,我会编写一个 Seq 表达式,它创建一个 2-tuples 的 IEnumerable,然后运行 Seq.unzip。在 C#(在 .NET 3.5 上)中执行此操作的正确机制是什么?
干杯,尤尔根
【问题讨论】:
你最好的选择可能是创建一个Pair<T1, T2> 类型并返回一个序列。 (或者使用匿名类型来做同样的事情。)
然后您可以使用以下命令“解压缩”它:
var firstElements = pairs.Select(pair => pair.First);
var secondElements = pairs.Select(pair => pair.Second);
可能值得首先实现pairs(例如,在您的第一个查询结束时调用ToList())以避免对查询进行两次评估。
基本上这与您的 F# 方法完全相同,但没有内置支持。
【讨论】:
由于 C# 中缺少元组,您可以创建匿名类型。 语义是:
someEnumerable.Select( inst => new { AnonTypeFirstStream = inst.FieldA, AnonTypeSecondStream = inst.FieldB });
这样您就不会受限于返回的流数量,您只需将字段添加到匿名类型,就像您可以将元素添加到元组一样。
【讨论】: