繁体   English   中英

如何为IGrouping设置默认值 <TKey, TSource> 计数= 0?

[英]How to Make a default value for IGrouping<TKey, TSource> with count = 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();
    }

该代码有效,但是如果我想知道数字始终为[0-9] ,并希望获得出现[0-9]的次数(如果未出现,则计数应为0 )。

因此,代码将获得ArgumentNullException ,这是有道理的,因为FirstOrDefault获取null

因此,要解决此问题,我想使用?? 运算符,并为其提供默认值。 但我想不出如何构建这样的价值。

您将如何解决? 请不要使用其他样式,例如if select new {}

像这样使用C#6空传播怎么样?

groups.FirstOrDefault(g => g.Key == n)?.Count() ?? 0

如果FirstOrDefault返回null,将不再对?.Count()求值并且不会引发异常。

您可以这样使用:

var higherLimits = new[] { 10, 20, 30 };
var ranges = items.GroupBy(item => higherLimits.First(higherLimits => higherLimits >= item));

这将完全避免空问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM