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