55 votes

Tableau des équivalents LINQ de IEnumerable en Scala ?

Duplicata possible :
Analogues de LINQ en Scala

Je cherche un tableau qui montre les équivalents en Scala des méthodes LINQ pour IEnumerable :

  • La première est la tête
  • Sélectionner est la carte
  • SingleOrDefault est ... (je ne sais pas)
  • ... et ainsi de suite

Quelqu'un connaît-il une telle table "translate" ?

1 votes

Pourquoi se contenter de moins que LINQ pour Scala (réimplémentation complète de l'API) : github.com/nicholas22/propelS

4 votes

@casperOne : Pourquoi ne pas fusionner les deux fils ?

7 votes

Cette question est loin d'être un doublon de l'autre. Cette question est beaucoup plus ciblée et concrète, alors que l'autre est plus vague. Les deux sont valables et différentes.

135voto

missingfaktor Points 44003

Je ne fais qu'énumérer les équivalents de fonctions de Enumerable<A> . Ce document est incomplet pour l'instant. Je vais essayer de le mettre à jour plus tard avec plus.

xs.Aggregate(accumFunc)              -> xs.reduceLeft(accumFunc)
xs.Aggregate(seed, accumFunc)        -> xs.foldLeft(seed)(accumFunc)
xs.Aggregate(seed, accumFunc, trans) -> trans(xs.foldLeft(seed)(accumFunc))
xs.All(pred)                         -> xs.forall(pred)
xs.Any()                             -> xs.nonEmpty
xs.Any(pred)                         -> xs.exists(pred)
xs.AsEnumerable()                    -> xs.asTraversable // roughly
xs.Average()                         -> xs.sum / xs.length
xs.Average(trans)                    -> trans(xs.sum / xs.length)
xs.Cast<A>()                         -> xs.map(_.asInstanceOf[A])
xs.Concat(ys)                        -> xs ++ ys
xs.Contains(x)                       -> xs.contains(x) //////
xs.Contains(x, eq)                   -> xs.exists(eq(x, _))
xs.Count()                           -> xs.size
xs.Count(pred)                       -> xs.count(pred)
xs.DefaultIfEmpty()                  -> if(xs.isEmpty) List(0) else xs // Use `mzero` (from Scalaz) instead of 0 for more genericity
xs.DefaultIfEmpty(v)                 -> if(xs.isEmpty) List(v) else xs
xs.Distinct()                        -> xs.distinct
xs.ElementAt(i)                      -> xs(i)
xs.ElementAtOrDefault(i)             -> xs.lift(i).orZero // `orZero` is from Scalaz
xs.Except(ys)                        -> xs.diff(ys)
xs.First()                           -> xs.head
xs.First(pred)                       -> xs.find(pred) // returns an `Option`
xs.FirstOrDefault()                  -> xs.headOption.orZero
xs.FirstOrDefault(pred)              -> xs.find(pred).orZero
xs.GroupBy(f)                        -> xs.groupBy(f)
xs.GroupBy(f, g)                     -> xs.groupBy(f).mapValues(_.map(g))
xs.Intersect(ys)                     -> xs.intersect(ys)
xs.Last()                            -> xs.last
xs.Last(pred)                        -> xs.reverseIterator.find(pred) // returns an `Option`
xs.LastOrDefault()                   -> xs.lastOption.orZero
xs.LastOrDefault(pred)               -> xs.reverseIterator.find(pred).orZero
xs.Max()                             -> xs.max
xs.Max(f)                            -> xs.maxBy(f)
xs.Min()                             -> xs.min
xs.Min(f)                            -> xs.minBy(f)
xs.OfType<A>()                       -> xs.collect { case x: A => x }
xs.OrderBy(f)                        -> xs.sortBy(f)
xs.OrderBy(f, comp)                  -> xs.sortBy(f)(comp) // `comp` is an `Ordering`.
xs.OrderByDescending(f)              -> xs.sortBy(f)(implicitly[Ordering[A]].reverse)
xs.OrderByDescending(f, comp)        -> xs.sortBy(f)(comp.reverse)
Enumerable.Range(start, count)       -> start until start + count
Enumerable.Repeat(x, times)          -> Iterator.continually(x).take(times)
xs.Reverse()                         -> xs.reverse
xs.Select(trans)                     -> xs.map(trans) // For indexed overload, first `zipWithIndex` and then `map`.
xs.SelectMany(trans)                 -> xs.flatMap(trans)
xs.SequenceEqual(ys)                 -> xs.sameElements(ys)
xs.Skip(n)                           -> xs.drop(n)
xs.SkipWhile(pred)                   -> xs.dropWhile(pred)
xs.Sum()                             -> xs.sum
xs.Sum(f)                            -> xs.map(f).sum // or `xs.foldMap(f)`. Requires Scalaz.
xs.Take(n)                           -> xs.take(n)
xs.TakeWhile(pred)                   -> xs.takeWhile(pred)
xs.OrderBy(f).ThenBy(g)              -> xs.sortBy(x => (f(x), g(x))) // Or: xs.sortBy(f &&& g). `&&&` is from Scalaz.
xs.ToArray()                         -> xs.toArray // Use `xs.toIndexedSeq` for immutable indexed sequence.
xs.ToDictionary(f)                   -> xs.map(f.first).toMap // `first` is from Scalaz. When f = identity, you can just write `xs.toMap`.
xs.ToList()                          -> xs.toList // This returns an immutable list. Use `xs.toBuffer` if you want a mutable list.
xs.Union(ys)                         -> xs.union(ys)
xs.Where(pred)                       -> xs.filter(pred)
xs.Zip(ys, f)                        -> (xs, ys).zipped.map(f) // When f = identity, use `xs.zip(ys)`

Il n'existe pas d'équivalent direct de certaines fonctions, mais il est assez facile de créer les siennes. Voici quelques fonctions de ce type.

Simple :

def single[A](xs: Traversable[A]): A = {
  if(xs.isEmpty) sys error "Empty sequence!"
  else if(xs.size > 1) sys error "More than one elements!"
  else xs.head
}

SingleOrDefault :

def singleOrDefault[A : Zero](xs: Traversable[A]): A = {
  if(xs.isEmpty) mzero
  else if(xs.size > 1) sys error "More than one elements!"
  else xs.head
}

Rejoignez :

def join[A, B, K, R](outer: Traversable[A], inner: Traversable[B])
    (outKey: A => K, inKey: B => K, f: (A, B) => R): Traversable[R] = {
  for(o <- outer; i <- inner; if outKey(o) == inKey(i)) yield f(o, i)
}

GroupJoin :

def groupJoin[A, B, K, R](outer: Traversable[A], inner: Traversable[B])
    (outKey: A => K, inKey: B => K, f: (A, Traversable[B]) => R): Traversable[R] = {
  for(o <- outer) yield {
    val zs = for(i <- inner; if outKey(o) == inKey(i)) yield i
    f(o, zs)
  }
}

Notes :

  1. En Scala idiomatique, les fonctions totales sont généralement préférées aux fonctions partielles. Ainsi, une implémentation idiomatique de single y singleOrDefault produirait une valeur de type Either[Exception, A] au lieu de A . Par exemple, voici une mise en œuvre raffinée de single qui renvoie Either[Exception, A] .

    def single[A](xs: Traversable[A]): Either[Exception, A] = {
      if(xs.isEmpty) Left(new RuntimeException("Empty sequence!"))
      else if(xs.size > 1) Left(new RuntimeException("More than one elements!"))
      else Right(xs.head)
    }
  2. Scalaz's Zero / mzero ne sont pas tout à fait les mêmes que celles de C# default mécanisme de valeur. Pour plus de détails, vous pouvez vous référer à este J'ai écrit un article sur ce sujet il y a quelque temps.

  3. Vous pouvez utiliser le modèle "enrichir ma bibliothèque" pour obtenir le même effet que les méthodes d'extension de C#. Reportez-vous à este y este pour les détails.

1 votes

Merci BEAUCOUP ! !! Lors de la mise à jour, s'il n'y a pas de mappage 1:1, veuillez simplement le mettre comme "pas de mappage 1:1", merci d'avance.

0 votes

Le troisième Aggregate est incorrecte. trans(xs.foldLeft(seed)(accumFunc)) est approprié.

0 votes

@missingfaktor : Serait-il possible d'utiliser cette liste pour docs.scala-lang.org ?

0voto

pr1001 Points 8334

Je ne connais rien à C# ou LINQ, mais est-ce que c'est ce que vous cherchez ?

scala> val l = List(1, 2, 3, 4, 5)
l: List[Int] = List(1, 2, 3, 4, 5)

scala> l.head
res0: Int = 1

scala> l.headOption
res1: Option[Int] = Some(1)

scala> l.map(_.toString)
res2: List[java.lang.String] = List(1, 2, 3, 4, 5)

scala> l(1)
res3: Int = 2

Il n'y a pas de méthode pour obtenir un élément ou un défaut, mais ceci fonctionnera :

scala> scala.util.control.Exception.allCatch.opt(l(5)) getOrElse 0
res4: Int = 0

0 votes

Merci, mais je cherche une traduction complète LINQ -> Scala, afin d'être mentalement sur la bonne voie plus rapidement. Quelque chose à imprimer, à lire et à mémoriser.

3 votes

Pour le dernier, vous auriez pu faire l.lift(5).getOrElse(0) .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X