【发布时间】:2019-08-29 03:36:39
【问题描述】:
我有一个不应多次枚举的 LINQ 查询,我想避免错误地枚举它两次。我可以使用任何扩展方法来确保我免受此类错误的影响吗?我正在考虑这样的事情:
var numbers = Enumerable.Range(1, 10).OnlyOnce();
Console.WriteLine(numbers.Count()); // shows 10
Console.WriteLine(numbers.Count()); // throws InvalidOperationException: The query cannot be enumerated more than once.
我想要这个功能的原因是因为我有一个可枚举的任务,旨在逐步实例化和运行任务,同时在控制下缓慢枚举。我已经犯了两次运行任务的错误,因为我忘记了它是一个不同的可枚举而不是 一个数组。
var tasks = Enumerable.Range(1, 10).Select(n => Task.Run(() => Console.WriteLine(n)));
Task.WaitAll(tasks.ToArray()); // Lets wait for the tasks to finish...
Console.WriteLine(String.Join(", ", tasks.Select(t => t.Id))); // Lets see the completed task IDs...
// Oups! A new set of tasks started running!
【问题讨论】:
-
引入自定义类,该类将在后台使用 Queue。实现
GetEnumerator,它将在每次迭代时从队列中删除项目——这样你就可以安全地迭代你的类,而无需多次执行任务,因为任务将在第一次迭代时被删除。使用ImmutableQueue获取线程安全类。
标签: c# linq task-parallel-library