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
andfalse
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.iter
和 Seq.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/