c# - 在 C# 中为 IEnumerable 实现的 F# Seq 模块?

标签 c# f#

F# 有一堆标准的序列运算符,我从使用 Mathematica 的经验中了解到并喜欢上了这些运算符。 F# 现在引起了我的广泛关注,当它正式发布时,我打算经常使用它。

目前,由于 F# 尚未正式发布,我无法真正在生产代码中使用它。 LINQ 使用类似 SQL 的名称(例如“select”是“map”,“where”是“filter”)实现其中一些运算符,但我找不到“fold”、“iter”或“partition”的实现。

有人见过标准序列运算符的 C# 实现吗?这是某人应该写的东西吗?

最佳答案

如果仔细观察,许多 Seq 操作都有 LINQ 等价物,或者可以很容易地推导出来。只是低头看list ...

  • Seq.append = Concat<TSource>(IEnumerable<TSource> second)

  • Seq.concat = SelectMany<IEnumerable<TSource>, TResult>(s => s)

  • Seq.distinct_by = GroupBy(keySelector).Select(g => g.First())

  • Seq.exists = Any<TSource>(Func<TSource, bool> predicate)

  • Seq.mapi = Select<TSource, TResult>(Func<TSource, Int32, TResult> selector)

  • Seq.fold = Aggregate<TSource, TAccumulate>(TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func)

List.partition定义如下:

Split the collection into two collections, containing the elements for which the given predicate returns true and false respectively

我们可以使用 GroupBy 和一个二元素数组作为穷人的元组来实现:

public static IEnumerable<TSource>[] Partition<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
    return source.GroupBy(predicate).OrderByDescending(g => g.Key).ToArray();
}

元素 0 保存真值; 1 持有假值。 GroupBy 本质上是类固醇的分区。

最后,Seq.iterSeq.iteri轻松映射到 foreach:

public static void Iter<TSource>(this IEnumerable<TSource> source, Action<TSource> action)
{
    foreach (var item in source)
        action(item);
}

public static void IterI<TSource>(this IEnumerable<TSource> source, Action<Int32, TSource> action)
{
    int i = 0;
    foreach (var item in source)
        action(i++, item);
}

关于c# - 在 C# 中为 IEnumerable 实现的 F# Seq 模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/410717/

相关文章:

c# - 程序定义了多个入口点? CS0017 main() 有问题?

c# - 如何将 HttpRequest 接收到 MVC 3 Controller 操作中?

c# - 共享资源访问的优化同步

.net - Event.Trigger Event.Publish f#

f# - 递归区分联合案例类型

F# 隐藏突变

c# - 减去两个日期

java - Android viewPager使用本地html内存不足

f# - 如何选择方法的特定重载?

f# - 将联合类型区分为单一类型的过滤列表