c# - 如何为 IGrouping 设置默认值计数 = 0?
问题描述
我喜欢 C# linq 以及扩展方法风格。
这是一个简单的代码,用于获取数组中每个数字的次数:
static void Main(string[] args)
{
int[] nums = { 1, 2, 2, 3, 3, 3 };
var groups = nums.GroupBy(n => n);
//var keynums = nums.Distinct();//ok
var keynums = Enumerable.Range(0, 10);//causes ArgumentNullException
var timesDict = keynums.ToDictionary(n => n,
n =>
groups.FirstOrDefault(g => g.Key == n)
//((groups.FirstOrDefault(g => g.Key == n))??what can be put here)
.Count());
foreach (var kv in timesDict)
{
Console.WriteLine($"{kv.Key}\t{string.Join(" ", kv.Value)}");
}
Console.ReadKey();
}
该代码有效,但如果我想知道 nums总是 [0-9] ,并且想知道[0-9]出现了多少次(如果没有出现,则计数应该是0)。
所以代码会得到ArgumentNullException
,这是有道理的,因为FirstOrDefault
得到了null
。
所以要解决这个问题,我想使用??
运算符,并给它一个默认值。但我想不出如何构建这样的价值。
你会怎么解决?请不要使用其他样式,例如if
, select new {}
。
解决方案
像这样使用 C#6 空传播怎么样?
groups.FirstOrDefault(g => g.Key == n)?.Count() ?? 0
如果FirstOrDefault
返回 null,?.Count()
将不再评估,也不会抛出异常。
推荐阅读
- reactjs - 续集 Op.like 和 Op.or 失败
- spring - Spring @Scheduled cron 作业
- r - 如何按 R 中的特定元素编号对数据框中的元素进行分组?
- java - 从 Soap Envelope 获取 X509 证书别名
- spring - Spring Kafka 2.6.x ErrorHandler 和 DeadLetterPublishingRecoverer 与 ConcurrentKafkaListenerContainerFactory
- mongodb - 如何使用 Talend Open Studio 处理数百万条 MongoDB 记录并将其插入 Postgres
- c# - 我怎样才能使 .net5 C#9 默认目标框架 VS2019
- html - 为什么我的下拉菜单显示在顶部?
- javascript - 将具有嵌套数组的对象转换为 FormData
- node.js - 您如何对 Dynamodb 触发器“问题:函数调用失败”或 Lambda“配置中缺少凭据”进行故障排除?