TakeWhile, но получить элемент, который остановил его также

Я хотел бы использовать LINQ TakeWhile функцию LINQ to Objects. Тем не менее, мне также нужно знать первый элемент, который "сломал" функцию, т.е. Первый элемент, где условие было неверным.

Есть ли одна функция для получения всех объектов, которые не совпадают, плюс первая, которая делает?

Например, учитывая набор {1,2,3,4,5,6,7,8},

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

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

Ответы

Ответ 1

Я думаю, вы можете использовать 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;
    }
}

Ответ 2

LINQ to Objects не имеет такого оператора. Но просто реализовать расширение TakeUntil самостоятельно. Здесь одна такая реализация из moreLinq.

Ответ 3

Просто для удовольствия:

var a = new[] 
    {
        "two",
        "three",
        "four",
        "five",
    };
  Func<string, bool> predicate = item => item.StartsWith("t");      
  a.TakeWhile(predicate).Concat(new[] { a.SkipWhile(predicate).FirstOrDefault() })