LINQ在Scala中选择等效的

时间:2016-11-17 17:47:06

标签: linq scala

我有一些非常简单的.NET逻辑,我正在移植到Scala代码库中,我真的不知道Scala的第一件事。它包括一个LINQ查询,它通过使用匿名类型投影来展平和连接,然后分组,例如:

,对标记对象的集合进行分组。
var q = things.SelectMany(t => t.Tags, (t, tag) => new { Thing = t, Tag = tag })
              .GroupBy(x => x.Tag, x => x.Thing);

在Scala中看起来flatMap可能有用,但我无法弄清楚如何通过匿名将其与groupBy结合起来。

这种事情在Scala中是否更复杂,或者我错过了一些简单的东西?

更新:

我最终选择了:

things.flatMap(t => t.Tags.map(x => (x,t))).groupBy(x => x._1)

然后当我稍后访问我需要做的地图中的值时:

.map(x => x._2) 

让群组脱离元组。

当你知道怎么做时很简单!

1 个答案:

答案 0 :(得分:1)

对我来说,你想要做类似的事情。

case class Tag(tag:String)

case class Thing(Tags : Seq[Tag])

val things :Seq[Thing] = Seq(Thing(Seq(Tag(""))))

val q = things.map {
  thing => new {
    val Thing = thing
    val Tags = thing.Tags
  }
}.flatMap {
  thingAndTags => thingAndTags.Tags.map {
    tag => new {
      val Thing = thingAndTags.Thing
      val Tag = tag
    }
  }
}. groupBy {
  thingAndTag => thingAndTag.Tag
}.map {
  tagAndSeqOfThingAndTags =>
    tagAndSeqOfThingAndTags._1 -> tagAndSeqOfThingAndTags._2.map(x => x.Thing)
}

但是在Scala中,匿名对象并不常见,但您可以使用Tuple2[T1,T2]代替所有new { val ...} s,

val q = things.map {
  thing => ( thing->thing.Tags)
}.flatMap {
  thingAndTags => thingAndTags._2.map {
    tag => (thingAndTags._1, tag)
  }
}.groupBy {
  thingAndTag => thingAndTag._2
}.map {
  tagAndSeqOfThingAndTags =>
    tagAndSeqOfThingAndTags._1 -> tagAndSeqOfThingAndTags._2.map(x => x._1)
}

它与所有._1._2 s

有点混淆