TakeWhile
LINQ to Objects でLINQ 関数を使用したいと考えています。ただし、関数を「壊した」最初の要素、つまり条件が真ではなかった最初の要素も知る必要があります。
一致しないすべてのオブジェクトと、一致する最初のオブジェクトを取得する単一の関数はありますか?
たとえば、集合 が与えられた場合{1, 2, 3, 4, 5, 6, 7, 8}
、
mySet.MagicTakeWhile(x => x != 5);
=> {1, 2, 3, 4, 5}
TakeWhile
LINQ to Objects でLINQ 関数を使用したいと考えています。ただし、関数を「壊した」最初の要素、つまり条件が真ではなかった最初の要素も知る必要があります。
一致しないすべてのオブジェクトと、一致する最初のオブジェクトを取得する単一の関数はありますか?
たとえば、集合 が与えられた場合{1, 2, 3, 4, 5, 6, 7, 8}
、
mySet.MagicTakeWhile(x => x != 5);
=> {1, 2, 3, 4, 5}
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;
}
}
LINQ to Objects には、そのような演算子はありません。TakeUntil
しかし、拡張機能を自分で実装するのは簡単です。これはmoreLinqからのそのような実装の1 つです。
楽しみのために:
var a = new[]
{
"two",
"three",
"four",
"five",
};
Func<string, bool> predicate = item => item.StartsWith("t");
a.TakeWhile(predicate).Concat(new[] { a.SkipWhile(predicate).FirstOrDefault() })