我喜欢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();
}
该代码有效,但是如果我想知道数字总是 [0-9] ,并想获得出现 [0-9] 的次数(如果未显示,则计数应为 0 )。
因此代码将获得ArgumentNullException
,这很有意义,因为FirstOrDefault
得到了null
。
因此,要解决此问题,我想使用??
运算符,并为其指定默认值。但我想不出如何构建这样的价值。
您将如何解决?请不要使用其他样式,例如if
,select new {}
。
答案 0 :(得分:2)
如何使用像这样的C#6空传播?
groups.FirstOrDefault(g => g.Key == n)?.Count() ?? 0
如果FirstOrDefault
返回null,则将不再对?.Count()
求值并且不会引发异常。
答案 1 :(得分:0)
您可以这样使用:
var higherLimits = new[] { 10, 20, 30 };
var ranges = items.GroupBy(item => higherLimits.First(higherLimits => higherLimits >= item));
这将完全避免空问题。