2016-09-02 20 views
0

几次发现我自己的情况:我有一个IEnumerable<T>和函数map,它将T的实例映射到IEnumerable<U>。我想生成一个由该地图定义的ILookup<T, U>紧凑的方式将IEnumerable映射到LINQ的ILookup

这似乎是一个非常常见的用例,但我还没有找到一种紧凑的方法来产生查找。特别是,enumT.ToLookup(t=>t, t=>map(t))产生ILookup<T, IEnumerable<U>>

+0

我并不真正关注。你有一个't []'数组和一个将单个't'映射到'IEnumerable '的函数,并且你想以某种方式使用该函数为每个'T'生成一个单独的'U'? –

+0

@ stephen.vakil不完全。他希望每个'T'都有一个'IEnumerable ',但他现在所拥有的是每个'T'的'IEnumerable >'。 – Servy

回答

2

在调用ToLookup之前,只需使用SelectMany即可平整序列。

var lookup = sequence.SelectMany(key => Foo(key), (key, value) => new { key, value, }) 
    .ToLookup(pair => pair.key, pair => pair.value); 
+0

谢谢,我不知道有关'SelectMany'的重载,它比我以前做的好得多。 – starwed