gpt4 book ai didi

c# - 处理列表和 List.Take()

转载 作者:太空宇宙 更新时间:2023-11-03 20:03:10 28 4
gpt4 key购买 nike

给定:

// got a dictionary wrapped in a class - reading values into list
List<string> caplist = QuizData.Dict.Values.ToList();

// shuffle cap list - I know it's not "really random"
var rnd = new Random();
var shufcapList = caplist.OrderBy(item => rnd.Next());

// take first fifteen from shuffled list for caps choices
var firstFifteenItems = shufcapList.Take(15);
foreach (string cap1 in firstFifteenItems) {
Console.WriteLine("1st_15"+cap1); //seems OK

}

// take first 6 from firstFifteenItems (it's been shuffled) list for states
var firstSixItems = firstFifteenItems.Take(6);
foreach (string cap2 in firstSixItems) {
Console.WriteLine("1st_6" + cap2);
}

但 firstSixItems 不是 firstFifteenItems 的子集。不应该吗?我是在 firstFifteenItems 中查看控制台输出中的 15 个项目吗?我从 firstSixItems 中数出 6 个项目,但这些项目不在 firstFifteenItems 中。我想非破坏性地将前 6 个项目从一个列表复制到另一个列表中。我错过了一些明显的东西吗?感谢您的帮助。

最佳答案

这里的“问题”是惰性求值。

这些可枚举项在被枚举之前不会被评估。在此之前,调用 OrderBy 返回的 IEnumerable 只是一组关于如何检索元素的指令,但没有实际上任何结果呢。在 foreach 循环之前,对 Take(15) 的调用实际上不会被评估。

Take(6) 的调用在其后面的 foreach 中进行计算,但它是从 firstFifteenItems 派生的可枚举,它本身就是原始 OrderBy 的惰性枚举,因此它多次调用 rnd.Next() 。当然,每次调用 rnd.Next() 都会返回(可能)不同的结果。

OrderBy 上调用 ToList(),您将看到预期的行为,因为 ToList() 将枚举并存储结果.

关于c# - 处理列表和 List.Take(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25904947/

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