【问题标题】:How to Make a default value for IGrouping<TKey, TSource> with count = 0?如何使用 count = 0 为 IGrouping<TKey, TSource> 设置默认值?
【发布时间】:2018-12-23 09:48:47
【问题描述】:

我喜欢 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

为了解决这个问题,我想使用?? 运算符,并给它一个默认值。但我想不出如何构建这样的价值。

你会怎么解决?请不要使用ifselect new {}等其他样式。

【问题讨论】:

    标签: c# linq dictionary grouping


    【解决方案1】:

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

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

    如果FirstOrDefault 返回null,则?.Count() 将不再被求值,也不会抛出异常。

    【讨论】:

    • 谢谢!这行得通,?. 运算符似乎是在 C# 6 中引入的,并且晚于 ???
    • 是的,?? 已经存在了一段时间,但是 ? 运算符是在 C#6 中引入的。它使?? 运算符更加有用:)
    • 你在== n))中有额外的)
    【解决方案2】:

    你可以这样使用:

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

    这将完全避免 null 问题。

    【讨论】:

    • 你的意思是GroupBy可以处理null键的情况吗?
    猜你喜欢
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    相关资源
    最近更新 更多