F#List.collect与C#List.SelectMany中的相同吗?

kog*_*oia 6 c# linq f#

List.collect是LINQ List.SelectMany的等价物吗?

[1;2;3;4] |> List.collect (fun x -> [x * x]) // [1;4;9;16]
Run Code Online (Sandbox Code Playgroud)

在LINQ

new List<int>() { 1, 2, 3, 4 }
       .SelectMany(x => new List<int>() { x * x }); // 1;4;9;16
Run Code Online (Sandbox Code Playgroud)

编辑:

更合适的例子

let list1 = [1;2;3;4]
let list2 = [2;4;6]

// [2; 4; 6; 4; 8; 12; 6; 12; 18; 8; 16; 24]
list1 |> List.collect (fun a -> list2 |> List.map (fun b -> a * b)) 
Run Code Online (Sandbox Code Playgroud)

...

var list1 = new List<int>() { 1, 2, 3, 4 };
var list2 = new List<int>() { 2, 4, 6 }

// 2,4,6,4,8,12,6,12,18,8,16,24
list1.SelectMany(a => list2.Select(b => a * b)); 
Run Code Online (Sandbox Code Playgroud)

The*_*ght 11

或多或少.直接F#等同于SelectManySeq.collect其拥有的签名:

Seq.collect : ('T -> 'Collection) -> seq<'T> -> seq<'U> (requires 'Collection :> seq<'U>)
Run Code Online (Sandbox Code Playgroud)

seq<'T>只是一个类型别名IEnumerable<T>.

F#list是一个具体的集合(一个不可变的列表),因此List.collect被严格评估.

另请注意,F#list和.NET System.Collections.Generic.List<T>类型不相同. System.Collections.Generic.List<T>是一个可变集合,通常通过其ResizeArray<'T>在F#中的类型别名来引用.


Lee*_*Lee 8

它们的行为相同,但Enumerable.SelectMany返回一个惰性序列(IEnumerable<T>),同时List.collect返回严格创建的列表.另请注意,F#列表是持久链接列表,而C#列表由数组支持.