我想在LINQ to Objects上使用LINQ TakeWhile
函数。但是,我还需要知道“破坏”函数的第一个元素,即条件不正确的第一个元素。
是否有一个函数可以获取所有不匹配的对象,加上第一个对象是什么?
例如,给定集合{1, 2, 3, 4, 5, 6, 7, 8}
,
mySet.MagicTakeWhile(x => x != 5);
=> {1, 2, 3, 4, 5}
答案 0 :(得分:10)
我认为您可以使用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;
}
}
答案 1 :(得分:6)
LINQ to Objects没有这样的运算符。但是自己实现TakeUntil
扩展是很简单的。这是来自one such implementation的moreLinq。
答案 2 :(得分:0)
只是为了好玩:
var a = new[]
{
"two",
"three",
"four",
"five",
};
Func<string, bool> predicate = item => item.StartsWith("t");
a.TakeWhile(predicate).Concat(new[] { a.SkipWhile(predicate).FirstOrDefault() })