2011-08-25 95 views
65

我一直在尋找一種方法來使用映射函數(以Linq兼容的方式)將IEnumerable的每個元素轉換爲其他東西,但是我沒有找到任何東西。C#/ Linq:將映射函數應用於IEnumerable中的每個元素?

對於一個(簡單的)例子,它應該能夠做到像

IEnumerable<int> integers = new List<int>() { 1, 2, 3, 4, 5 }; 
IEnumerable<string> strings = integers.Transform(i => i.ToString()); 

但我沒有發現任何東西。我的意思是,編寫一個擴展方法是非常簡單的(基本上,它需要的只是將源枚舉器封裝到一個新類中,然後編寫一些樣板代碼以將調用委託給它),但是我期望這是一個相當基本的操作,並自己寫作感覺就像重新發明輪子 - 我不能動搖這種感覺,可能有一種我應該使用的內置方式,而且我太盲目了,無法看到它。

那麼... Linq中有什麼東西可以讓我做上面描述的嗎?

+3

怎麼樣'.Select' –

+0

可能涉及d:[Haskell中的C#等效於map函數](http://stackoverflow.com/q/2142935/456814)。 – 2015-10-21 10:35:01

回答

101

您可以只使用Select()擴展方法:

IEnumerable<int> integers = new List<int>() { 1, 2, 3, 4, 5 }; 
IEnumerable<string> strings = integers.Select(i => i.ToString()); 

或者在LINQ語法:

IEnumerable<int> integers = new List<int>() { 1, 2, 3, 4, 5 }; 

var strings = from i in integers 
       select i.ToString(); 
+4

啊!我知道必須有一種方法。一些舊的「森林/樹木視覺障礙問題」,我猜:) –

+1

請注意,如果你的地圖有副作用,你可能會遇到麻煩,因爲'Select()'的主體不一定會被執行直到列舉。這並不是一個好主意,但可能會出現一些情況,您可能需要添加'ToList()'來強制它評估整個列表。 –

+4

調用一種形式的「linq查詢語法」和另一種形式的「linq方法語法」是否更正確? –

18

您正在尋找Select可用於改造\項目的輸入順序:

IEnumerable<string> strings = integers.Select(i => i.ToString()); 
+8

MS從未遇到過逃離強制重命名的術語。這是一種疾病。沒有地圖,過濾器,摺疊或縮小,但你可以選擇,聚合... –

+3

公平地說它應該與SQL匹配(後者是一組術語) – luolimao

相關問題