如何解决使用列表的相同状态获得多个计数
我有这样的代码:
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
上的列表中的项目进行分组,并创建一个计数字典。然后,您可以获取成功和失败的计数,并通过添加它们来创建总数。
只需对juharr的答案做一个变体,快照即可
var current = taskList.Select(x => (x.IsCompleted,x.Result)).ToList();
count = current.Count(x => x.IsCompleted)
successfulCount = current.Count(x => x.IsCompleted && x.Result == true);
failedCount = current .Count(x => x.IsCompleted && x.Result == false);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。