18

我想TakeWhile在 LINQ to Objects 上使用 LINQ 函数。但是,我还需要知道“破坏”函数的第一个元素,即条件不成立的第一个元素。

是否有一个函数可以获取所有不匹配的对象,以及第一个匹配的对象?

例如,给定集合{1, 2, 3, 4, 5, 6, 7, 8}

mySet.MagicTakeWhile(x => x != 5);

=> {1, 2, 3, 4, 5}

4

3 回答 3

13

我认为您可以使用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;
    }
}
于 2012-08-09T12:31:17.997 回答
7

LINQ to Objects 没有这样的运算符。但是自己实现TakeUntil 扩展很简单。这是来自moreLinq的一个这样的实现

于 2012-08-09T12:31:19.543 回答
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() })
于 2012-08-09T12:40:09.397 回答