que c# linq scala ienumerable iterable

que - yield return c# stack overflow



¿Gráfico de equivalentes IEnumerable LINQ en Scala? (2)

Posible duplicado:
Análogos de LINQ en Scala

Estoy buscando un gráfico que muestre equivalentes en los métodos de Scala of LINQ para IEnumerable:

  • Primero es la cabeza
  • Seleccionar es mapa
  • SingleOrDefault es ... (No lo sé)
  • ... y así

¿Alguien sabe algo de esa tabla de "traducir"?


No sé nada sobre C # o LINQ, ¿pero es esto lo que estás buscando?

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

No hay un método para obtener un elemento o un valor predeterminado, pero esto funcionará:

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


Solo estoy enumerando los equivalentes de las funciones de Enumerable<A> . Esto está incompleto a partir de ahora. Intentaré actualizar esto más tarde con más.

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)`.

No hay un equivalente directo de algunas funciones, pero es bastante fácil hacer las suyas. Estas son algunas de esas funciones.

Individual :

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 }

Únete :

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) } }

Notas :

  1. En la Scala idiomática, generalmente se prefieren las funciones totales a las funciones parciales. Por lo tanto, la implementación idiomática de single singleOrDefault produciría un valor de tipo Either[Exception, A] lugar de A Por ejemplo, aquí hay una implementación refinada de single que devuelve 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. El Zero / mzero no es lo mismo que el mecanismo de valor default C #. Para más detalles, puede consultar this publicación que escribí sobre este tema hace algún tiempo.

  3. Puede usar el patrón enriquecer mi biblioteca para lograr el mismo efecto que los métodos de extensión de C #. Consulte this y this para más detalles.