Оцените оператор switch только один раз в C # - PullRequest
0 голосов
/ 21 февраля 2019

Я работал с switch statement, и он отлично работает.Тем не менее, я хочу, чтобы дело оценивалось только один раз, и, если оно произойдет снова, не оценивайтеВот код, который я пробовал, который работает:

private static int total = 0;
private static string[] ErrorCode = new string[] { "@", "-2", "!" };

private static int Score(string[] errorCodes)
{
    var sum = 0;
    foreach (var ec in errorCodes)
    {
        switch (ec)
            {
                case "@":
                    sum += 1;
                    break;
                case "-2":
                    sum += -2;
                    break;
                case "!":
                    sum += 5;
                    break;
            }
    }
    return sum; //This returns 4
 }

Но, если массив string[] имеет повторяющееся значение, он добавляет значение, которое вычисляется снова.Как это:

private static string[] ErrorCode = new string[] { "@", "-2", "!", "!" };
//This returns 9 (Because of "!") but would like to return 4

Как мне достичь оценки "!" только один раз, или я должен выбрать другой подход?Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Использование .Distinct(), вероятно, самое простое изменение, учитывая код, который у вас уже есть.

В качестве альтернативы, здесь есть несколько более лаконичное решение, использующее только LINQ и поиск Dictionary:

private static readonly Dictionary<string, int> _errorCodeScores = new Dictionary<string, int>
{
    { "@", 1 },
    { "-2", -2 },
    { "!", 5 },
};

private static int Score(string[] errorCodes)
{
    return _errorCodeScores
        .Where(s => errorCodes.Any(c => s.Key == c))
        .Sum(s => s.Value);
}
0 голосов
/ 21 февраля 2019

Используйте метод расширения Distinct Linq, чтобы позволить циклу foreach перечислять различные значения в ваших errorCodes collection / array:

using System.Linq;

...

foreach (var ec in errorCodes.Distinct())
{
    ...
}

(Не забудьте импортироватьSystem.Linq пространство имен.)

...