TakeWhile,但也得到了阻止它的元素

时间:2012-08-09 12:28:32

标签: c# .net linq linq-to-objects

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

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

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

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

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

3 个答案:

答案 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 implementationmoreLinq

答案 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() })