2009-06-09 133 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