我有IEnumerable
个值,我需要在开始时跳过某些元素,我正在使用SkipWhile
。但是,我肯定需要至少一个元素(假设序列甚至包含至少一个元素开头)。如果所有元素都传递谓词(即跳过所有元素),我只想获得最后一个元素。如果没有像
items.SkipWhile(/* my condition */).FallbackIfEmpty(items.Last())
(昂贵如下:它需要迭代序列两次,我想阻止它)
答案 0 :(得分:5)
LINQ没有为此提供内置方法,但您可以编写自己的扩展名。
这个实现大部分来自微软的reference code:
public static IEnumerable<TSource> SkipWhileOrLast<TSource>(
this IEnumerable<TSource> source,
Func<TSource, bool> predicate
) {
bool yielding = false;
TSource last = default(TSource);
bool lastIsAssigned = false;
foreach (TSource element in source) {
if (!yielding && !predicate(element)) {
yielding = true;
}
if (yielding) {
yield return element;
}
lastIsAssigned = true;
last = element;
}
if (!yielding && lastIsAssigned) {
yield return last;
}
}