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#等同于SelectMany
将Seq.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#中的类型别名来引用.
它们的行为相同,但Enumerable.SelectMany
返回一个惰性序列(IEnumerable<T>
),同时List.collect
返回严格创建的列表.另请注意,F#列表是持久链接列表,而C#列表由数组支持.