c# - TakeWhile,但我也想要输入序列的其余部分
问题描述
我想要一些有效地执行相同TakeWhile
但返回两个序列的东西:
- 结果
TakeWhile
- 输入序列的其余部分与 1. 删除
我知道我可以做类似的事情:
var a = input.TakeWhile(...);
var b = input.Skip(a.Count);
但这似乎可能不是最佳的,具体取决于容器类型。我是否错过了在一次操作中执行此操作的一些巧妙方法?
我的最终目标是迭代一个大型集合,而不是预先存储它:
while(data.Count() > 0)
{
var y = data.First().Year;
var year = data.TakeWhile(c => c.Year == y);
data = data.Skip(year.Count());
Console.WriteLine($"{year.Count()} items in {y}");
}
解决方案
您可以使用 ToLookup 将源拆分为两个结果。
var source = new[] { 1, 3, 5, 2, 4, 6, 7, 8, 9 };
Func<int, bool> criteria = x => x % 2 == 1;
bool stillGood = true;
Func<int, bool> takeWhileCriteria = x =>
stillGood = stillGood && criteria(x);
var result = source.ToLookup(takeWhileCriteria);
var matches = result[true];
var nonMatches = result[false];
推荐阅读
- node.js - 猫鼬模型分离
- java - 从扩展类调用的修改方法
- javascript - 无法在 for 循环中使用 setTimeout 遍历超时值
- regex - 正则表达式精确匹配可能更大的字符串中的 16 个连续数字
- gradle - 告诉 IntelliJ 为 Gradle 制作 1 个单个模块而不是多个模块
- javascript - 这 2 个 windows.onscroll javascript 代码不能一起工作
- apache-spark - 调整 Spark:当可用内核不均匀时每个节点的执行器数量
- javascript - 将对象值转换为大写
- safari - VoiceOver 左右箭头键保留用于预定义行为。如何覆盖?
- python - 循环自定义类