【问题标题】:Returning multiple streams from LINQ query从 LINQ 查询返回多个流
【发布时间】:2009-06-09 11:53:10
【问题描述】:

我想编写一个返回两个对象流的 LINQ 查询。在 F# 中,我会编写一个 Seq 表达式,它创建一个 2-tuples 的 IEnumerable,然后运行 ​​Seq.unzip。在 C#(在 .NET 3.5 上)中执行此操作的正确机制是什么?

干杯,尤尔根

【问题讨论】:

标签: c# linq


【解决方案1】:

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

然后您可以使用以下命令“解压缩”它:

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

可能值得首先实现pairs(例如,在您的第一个查询结束时调用ToList())以避免对查询进行两次评估。

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

【讨论】:

  • 如果您的可枚举的计算成本很高或无限大,那么您将需要一个更复杂的解决方案来避免比 ToList 双重实现输入。使用队列来缓存未迭代输出的结果的分区实现会做到这一点。
【解决方案2】:

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

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

这样您就不会受限于返回的流数量,您只需将字段添加到匿名类型,就像您可以将元素添加到元组一样。

【讨论】:

  • System.Tuple 在 C# 中可用。
  • @NathanPhillips,System.Tuple 是在 .NET 4.0 中引入的,该版本在编写此答案近一年后发布。
猜你喜欢
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多