c# - 使用列表的相同状态获取多个计数
问题描述
我有这样的代码:
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 个计数调用,以便更有可能获得一致的结果?(我似乎不太可能,但我想我会问。)
解决方案
您可以执行以下操作
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
并创建一个计数字典。然后,您可以获得成功和失败的计数,并通过添加它们来创建总数。
推荐阅读
- android - 索引超出范围:ArrayList
- graphql - 桑格利亚查询返回 IntType
- objective-c - iOS12:UIWebView 问题
- python-3.x - 在python中滑动矩阵
- python - 在 python/django 中创建对象列表的最佳方法输出
- delphi - 在delphi上比较字符串得到错误不兼容的类型
- javascript - 如何使单选按钮显示/隐藏输入表单
- ms-access - 访问功能区的 2013 自定义图像
- android - 谷歌地图显示空白屏幕,早些时候它工作正常,但重新安装 android studio 后它停止了
- r - 从 POSIXct 过滤一天中的特定时间(时间跨度),参数为多天