gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:36:58 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com