Scala中与C# LINQ最短等效的方法是什么?

3

我需要在Scala中创建一堆新的对象。以下C#代码的最短等效代码是什么?

var n = 100;    
var persons = Enumerable.Range(1, n).Select(x=>new Person(x)).ToList();

这有什么问题吗?

val persons: List[Person] = (1 to n) map (new Person(_))

4
你只需要在末尾添加 toList - Lee
哦,谢谢,我的愚蠢。Scala 有 Resharper 吗?Eclipse 并没有提供太多信息。 - python_kaa
@om-nom-nom,即使不在IntelliJ IDEA中也可以吗?我太习惯R#了... - python_kaa
他们支持Scala,但是在语言和框架特性的覆盖范围方面,R#要先进得多。话虽如此,JB Scala团队做得非常出色,我每天都使用他们的插件,只是他们没有那么多时间和人手。 - om-nom-nom
2
它真的必须是一个List吗?你现在的方法给你一个Seq[Person](用Vector实现),对于大多数情况来说应该是很好的,如果不是更好的话。 - Luigi Plinge
显示剩余2条评论
1个回答

4
使用 List.range
List.range(1, n + 1).map(new Person(_))

或者像Lee建议的那样:
(1 to n).map(new Person(_)).toList

需要调用toList, 因为(1 to n).map(new Person(_))会产生一个IndexedSeq[Person]. 注意,1 to n的类型是Range.Inclusive, 与List.range(1, n + 1)的类型List[Int]不同。


Enumerable.Range 的第二个参数是计数,因此您需要使用 List.range(1, n + 1) - Lee
@FrankS.Thomas 谢谢。在 Scala 中通常使用点而不是空格吗?(1 to n)List.range(1, n + 1) 之间有什么区别? - python_kaa
2
@python_kaa 当您想要一个特定的集合,如列表、序列或迭代器时,可以使用List.range(因此将有List.range、Seq.range、Iterator.range等)。这些函数不仅限于范围:如果您不受基础1的限制,甚至可以使用更短的形式:List.tabulate(n)(new Person(_))。还要注意,有一个更常见的方法.fill,用于稍微不同的目的(只有N个元素,索引未使用)。(1 to n)是一种通用形式,通常与map、foreach操作一起使用,然后转换为所需的集合(如.toList、toArray)。 - om-nom-nom
@python_kaa (1 到 n) 更常用,因为并不是每个人都知道集合的伴随方法。 - om-nom-nom
关于方法调用时点号(.)和空格的问题:这是个人风格的问题。在大多数情况下,我喜欢使用点号,因为它更清晰地表明该方法被调用的对象。@python_kaa - Frank S. Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接