18

TakeWhileLINQ 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からのそのような実装の1 つです。

于 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 に答える