gpt4 book ai didi

c# - LINQ Enumerable 查询返回副本还是引用?

转载 作者:行者123 更新时间:2023-12-02 17:23:24 27 4
gpt4 key购买 nike

我想在 C++ 中复制 C# 中的 SkipTake 来创建切片。像这样的东西:

std::vector<int> numbers = { 59, 82, 70, 56, 92, 98, 85 };

auto slice = grades.skip(3).take(2); // {56, 92}

检查切片在 JS 中的工作原理后和 Golang ,我基本上明白他们更喜欢卷影复制而不是深复制。我了解分配新内存但拥有独立数据和通过仅复制引用来拥有相关数据之间的权衡。

现在,我还检查了SkipTake但我找不到他们使用哪一个。

简而言之,它们是否在开始和结束时返回某种枚举器?或者他们是否创建了一个全新的 IEnumerable?

编辑

所以,我不知道我们可以访问源代码(在评论中提到)。显然它返回一个迭代器:

public static IEnumerable<TSource> Skip<TSource>(this IEnumerable<TSource> source, int count) {
if (source == null) throw Error.ArgumentNull("source");
return SkipIterator<TSource>(source, count);
}
}

最佳答案

LINQ的Skip、Take等方法不返回任何集合。它们返回 IEnumerable 接口(interface),允许从底层源获取下一个元素。这就是延迟加载的概念。 SkipTake 实际上不会过滤您的集合,直到您需要结果为止。

您可以使用方法 ToArrayToList 将所有元素从 IEnumerable 复制到某个集合。

引用文章:https://odetocode.com/blogs/scott/archive/2008/10/01/lazy-linq-and-enumerable-objects.aspx

关于c# - LINQ Enumerable 查询返回副本还是引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61304831/

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