代码之家  ›  专栏  ›  技术社区  ›  Shawn Mclean

初始化并为不带循环的int列表赋值

f# c#
  •  1
  • Shawn Mclean  · 技术社区  · 15 年前

    有没有一个较短的方法可以做到这一点:

            List<int> mins = new List<int>();
            for(int i = 0; i<60; i++)
            {
                mins.Add(i+1);
            }
    

    如果C版本有功能版本,也欢迎使用F版本。

    4 回复  |  直到 15 年前
        1
  •  9
  •   Brian    15 年前

    F:

    open System.Collections.Generic 
    let r = new List<_>( [1..60] )
    

    C:

    var r = new List<int>(Enumerable.Range(1, 60));
    
        2
  •  4
  •   Tomas Petricek    15 年前

    在F中,我可能会写:

    [ 1 .. 60 ] |> ResizeArray.ofSeq
    

    这与显式调用构造函数相同,但它有一些更好的语法(您可以使用管道,并且不需要指定构造函数的类型参数)。

        3
  •  3
  •   Jon Skeet    15 年前

    这对于C版本来说是可行的:

    List<int> mins = Enumerable.Range(1, 60).ToList();
    

    当然,在内部循环。如果你对 IEnumerable<int> 相反,只需去掉 ToList 打电话,你会得到懒惰的评价。你已经有了F版本了,我明白了:)

        4
  •  2
  •   Yin Zhu    15 年前

    List<_> 在C中,是一个动态数组,而不是链表。在F, 列表& lt; ResizeArray<_> .

    以下是直接翻译的F版本:

    let mins = new ResizeArray<int> ()
    for i=0 to 60-1 do
        mins.Add(i+1)
    

    你可以使用 ResizeArray 模块:

    #r "FSharp.PowerPack.dll"
    let mins = ResizeArray.init 60 (fun i -> i+1)
    

    请注意,ResizeArray<gt;类型是在F_core中定义的,相同名称的模块在F_powerpack中。