c# - 在 C# 中等效于 Haskell 的 Data.List.Span
问题描述
您好,是否已经实施了任何有效的方法来获得 Haskell 的功能Data.List.span
?
span :: (a -> Bool) -> [a] -> ([a], [a])
基本上给定 alist
和 apredicate
我想在第一次出现错误谓词后将列表分成两pivot
部分。测试元素之后的元素False
可能会或可能不会尊重谓词,但我不在乎。
List: [1,2,3,1,2,3]
Predicate: x<3
Span: `span (x<3) [1,2,3,1,2,3]` => `([1,2],[3,1,2,3])`
更新
我不关心第一个错误谓词之后的元素。我只想在第一次出现False
谓词时拆分列表。序列可以True
在第一个False
谓词之后,但我仍然想拆分它。
解决方案
您可以使用TakeWhile
and Skip
:
public static IEnumerable<IEnumerable<T>> SplitWhen<T>(this IEnumerable<T> enumerable, Func<T, bool> predicate)
{
var first = enumerable.TakeWhile(predicate);
yield return first;
var second = enumerable.Skip(first.Count());
yield return second;
}
更新
为了避免多次迭代,并且不需要使用列表或数组:
public static IEnumerable<IEnumerable<T>> SplitWhen<T>(this IEnumerable<T> enumerable, Func<T, bool> predicate)
{
yield return enumerable.TakeWhile(predicate);
yield return enumerable.TakeAfter(predicate);
}
public static IEnumerable<T> TakeAfter<T>(this IEnumerable<T> enumerable, Func<T, bool> predicate)
{
bool yielding = false;
foreach (T item in enumerable)
{
if (yielding = yielding || !predicate(item))
{
yield return item;
}
}
}
推荐阅读
- email - Google Analytics - 电子邮件跟踪链接点击 - 如何在同一视图中查看所有自定义活动数据(“发送”、“打开”、“点击”)
- python - LSTM,多二进制数组输入和过拟合处理
- php - JQuery 特定问题 - PHP JSON 返回
- python - Python OpenCV VideoCapture read() 无法读取帧
- c - 在 Visual Studio 和 C 项目上运行之间的不一致
- data-mining - 数据挖掘,维度灾难
- testing - 开玩笑未解决的承诺不会失败
- swift - 在 react-native 和 swift 之间共享 cookie
- angular - 角度嵌套模型驱动的反应形式选择选项发布请求不起作用
- java - 如何使用 Android MediaPlayer 播放视频流?FileDescriptor,Uri,Path,MediaDataSource?