Какова цель скобок в этом переключателе и метке регистра? - PullRequest
6 голосов
/ 01 мая 2020

Я пишу функцию для службы товаров, в которой, если пользователь запрашивает все товары под определенным именем, он возвращает их все. Например, все телефоны, которые iPhone X и т. c.

, я получил помощь, чтобы заставить работать одну из функций, где, если есть больше чем 1 пункт, он вернет их все (это третий case):

var itemsList = items.ToList();

switch (itemsList.Count())
{
    case 0:
        throw new Exception("No items with that model");

    case 1:
        return itemsList;

    case { } n when n > 1:
        return itemsList;
}

return null;

Что смущает меня, для чего нужны { }? Мне сказали, что это «место подмены для определения типа». Я не уверен, что они имеют в виду под этим.

Как это тоже работает? Я не уверен, для чего нужен n.

Любая помощь очень ценится!

ПРОГРЕСС: После проверки с помощником, я теперь знаю, что { } похож на var. Но я все еще не уверен, почему он используется только здесь.

Ответы [ 2 ]

7 голосов
/ 01 мая 2020

Это возможность сопоставления с образцом , представленная в C# 8. { } соответствует любому ненулевому значению. n используется для объявления переменной, которая будет содержать совпадающее значение. Вот пример из MSDN , который показывает использование { }.

Объяснение вашего образца:

switch (itemsList.Count())
{
    case 0:
        throw new Exception("No items with that model");

    case 1:
        return itemsList;

    // If itemsList.Count() != 0 && itemsList.Count() != 1 then it will
    // be checked against this case statement.
    // Because itemsList.Count() is a non-null value, then its value will
    // be assigned to n and then a condition agaist n will be checked.
    // If condition aginst n returns true, then this case statement is
    // considered satisfied and its body will be executed.
    case { } n when n > 1:
        return itemsList;
}
4 голосов
/ 01 мая 2020

Он известен как property pattern. {} имеет дело с оставшимися ненулевыми объектами. Шаблоны свойств express свойство, которое должно иметь заданное c постоянное значение. Но, в вашем примере, я думаю, что просто использовать n в выражении-переключателя, убедившись, что n не равно нулю. Я имею в виду его эквивалент следующим образом.

if (itemsList is {} n && n.Count() > 1)
{
    return itemsList;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...