gpt4 book ai didi

c# - Linq:Take的 "opposite"?

转载 作者:可可西里 更新时间:2023-11-01 03:13:16 25 4
gpt4 key购买 nike

使用 Linq;如何做 Take 的“反面”?

即而不是获取前 n 个元素,例如 in

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 SQLNHibernate Linq 的情况下,如果生成的 SQL 处理它并生成类似(对于 SQL Server/T-SQL)

SELECT TOP(SELECT COUNT(*) -@n FROM ATable) * FROM ATable或者其他一些更聪明的 SQL 实现。

我想没有什么比这更好的了?(但编辑实际上不是问题的一部分。)

最佳答案

aCollection.Take(aCollection.Count() - n);

编辑:就像评论中出现的一条有趣信息一样 - 您可能认为 IEnumerable的扩展方法 .Count()很慢,因为它会遍历所有元素。但如果实际对象实现了 ICollectionICollection<T> , 它只会使用 .Count应该是 O(1) 的属性。因此在这种情况下性能不会受到影响。

可以看到IEnumerable.Count()的源码at TypeDescriptor.net .

关于c# - Linq:Take的 "opposite"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10247804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com