Как сделать значение по умолчанию для IGroupingсо счетом = 0? - PullRequest
0 голосов
/ 23 декабря 2018

Мне нравится 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 {}.

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Вы можете использовать вот так:

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

Это позволит полностью избежать нулевой проблемы.

0 голосов
/ 23 декабря 2018

Как насчет использования нулевого распространения C # 6, как это?

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

, если FirstOrDefault возвращает ноль, ?.Count() больше не будет оцениваться и не выбрасывать исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...