使用Linq;我如何做Take的“对立面”?
也就是说,不是获取前n个元素,例如
aCollection.Take(n)
我想要得到除最后n个元素之外的所有内容。就像这样
aCollection.Leave(n)
(不要问为什么:-)
编辑
我想我可以这样做,aCollection.TakeWhile((x, index) => index < aCollection.Count - n)
或者以扩展的形式
public static IEnumerable<TSource> Leave<TSource>(this IEnumerable<TSource> source, int n)
{
return source.TakeWhile((x, index) => index < source.Count() - n);
}
但是在Linq to SQL或SQL的情况下,如果生成的NHibernate能够处理它并生成类似于(对于SQL Server/T-SQL)的东西,那就更好了。
SELECT TOP(SELECT COUNT(*) -@n FROM ATable) * FROM ATable
或其他一些更聪明的SQL实现。
我想没有比这更好的了?(但编辑实际上不是问题的一部分。)
发布于 2012-04-20 22:04:57
我非常确定没有内置的方法可以做到这一点,但是通过链接Reverse
和Skip
可以很容易地做到这一点
aCollection.Reverse().Skip(n).Reverse()
发布于 2012-04-20 22:06:49
我不相信这有一个内置的函数。
aCollection.Take(aCollection.Count - n)
应该是合适的;取集合中的项目总数减去n应该跳过最后n个元素。
发布于 2018-01-12 03:39:04
与IEnumerable
哲学保持一致,对于没有实现ICollection
的情况,只需枚举一次,您可以使用以下扩展方法:
public static IEnumerable<T> Leave<T>(this ICollection<T> src, int drop) => src.Take(src.Count - drop);
public static IEnumerable<T> Leave<T>(this IEnumerable<T> src, int drop) {
IEnumerable<T> IEnumHelper() {
using (var esrc = src.GetEnumerator()) {
var buf = new Queue<T>();
while (drop-- > 0)
if (esrc.MoveNext())
buf.Enqueue(esrc.Current);
else
break;
while (esrc.MoveNext()) {
buf.Enqueue(esrc.Current);
yield return buf.Dequeue();
}
}
}
return (src is ICollection<T> csrc) ? csrc.Leave(drop) : IEnumHelper();
}
https://stackoverflow.com/questions/10247804
复制相似问题