首页 > 解决方案 > 使用列表的相同状态获取多个计数

问题描述

我有这样的代码:

count = taskList.Count(x => x.IsCompleted);
successfulCount = taskList.Count(x => x.IsCompleted && x.Result == true);
failedCount = taskList.Count(x => x.IsCompleted && x.Result == false);

然后我像这样使用它:

Console.Write($"\r {count} out of {calls} calls made. {successfulCount} successful, {failedCount} failed.");

问题是 taskList 正在另一个线程中更新。所以我最终收到这样的消息:

拨打了 777843 个电话中的 48 个。96成功,0失败

我知道它为什么这样做。在我计算 的时间count和计算 的时间之间successfulCount,我完成了更多任务。

但是向我的测试人员展示仍然有点奇怪(这是用于测试工具),所以,如果可以在不减慢我观察到的速度的情况下进行修复,那么我想修复它。

有没有办法在一个查询中发出 3 个计数调用,以便更有可能获得一致的结果?(我似乎不太可能,但我想我会问。)

标签: c#.netlinq

解决方案


您可以执行以下操作

var result = taskList.Where(x => x.IsCompleted)
    .GroupBy(x => x.Result)
    .ToDictionary(x => x.Key, x => x.Count());

var successfulCount = result.TryGetValue(true, out var success) ? success : 0;
var failedCount = result.TryGetValue(false, out var failed) ? failed : 0;
var count = successfulCount + failedCount;

这将对列表中的项目进行分组Result并创建一个计数字典。然后,您可以获得成功和失败的计数,并通过添加它们来创建总数。


推荐阅读