我想TakeWhile
在 LINQ to Objects 上使用 LINQ 函数。但是,我还需要知道“破坏”函数的第一个元素,即条件不成立的第一个元素。
是否有一个函数可以获取所有不匹配的对象,以及第一个匹配的对象?
例如,给定集合{1, 2, 3, 4, 5, 6, 7, 8}
,
mySet.MagicTakeWhile(x => x != 5);
=> {1, 2, 3, 4, 5}
我想TakeWhile
在 LINQ to Objects 上使用 LINQ 函数。但是,我还需要知道“破坏”函数的第一个元素,即条件不成立的第一个元素。
是否有一个函数可以获取所有不匹配的对象,以及第一个匹配的对象?
例如,给定集合{1, 2, 3, 4, 5, 6, 7, 8}
,
mySet.MagicTakeWhile(x => x != 5);
=> {1, 2, 3, 4, 5}
我认为您可以使用SkipWhile,然后取第一个元素。
var elementThatBrokeIt = data.SkipWhile(x => x.SomeThing).Take(1);
更新
如果你想要一个单一的扩展方法,你可以使用以下:
public static IEnumerable<T> MagicTakeWhile<T>(this IEnumerable<T> data, Func<T, bool> predicate) {
foreach (var item in data) {
yield return item;
if (!predicate(item))
break;
}
}
只是为了好玩:
var a = new[]
{
"two",
"three",
"four",
"five",
};
Func<string, bool> predicate = item => item.StartsWith("t");
a.TakeWhile(predicate).Concat(new[] { a.SkipWhile(predicate).FirstOrDefault() })