Проблемы с этим лямбда-кодом не возвращают значение для всех ситуаций - PullRequest
0 голосов
/ 30 января 2019

Я работаю над проектом, который требует использования нескольких лямбд.Я пытаюсь создать тот, который будет иметь две строки и INT подключен к нему, и если две строки одинаковы, то int ++.Вот мой код:

DelegateName tally = (x, y, z) => { if (x == y) z++; };

Я понимаю, как не все пути кода возвращают значение, но я не уверен, в каком направлении его исправить.По сути, я буду выполнять это 12 раз, чтобы добавить подсчет к одной из 12 переменных, если строка x совпадает со строкой y.Он считает количество подходящих строк и добавляет его в соответствующую переменную (целое число)

Вот код, который я пытаюсь заменить лямбда-выражением:

if (cellValue.ToString().Substring(0, 1) == "1")
                {
                    variable1++;
                }

Надеялсяочистить его, вызвав tally (cellValue.ToString (). SubString (0,1), 1, variable1) вместо

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Думайте о лямбде, как о сокращении обычного метода.Лямбда, которую вы указали:

(x, y, z) => { if (x == y) z++; }

, преобразуется в:

void IncrementIfEqual(string x, string y, int z)
{
    if (x == y) z++;
}

(у лямбд нет имени метода, поэтому я просто случайно назвал метод IncrementIfEqual).Вы не возвращаете никакого значения внутри метода, поэтому метод возвращает void.Кроме того, аргумент z, который вы передаете, увеличивается внутри метода, но не влияет на значение передаваемой исходной переменной. Например, если вы вызвали метод, который вы написали следующим образом ...

IncrementIfEqual(cellValue.ToString().Substring(0, 1), "1", variable1)

, тогда переменная1 останется тем же значением после вызова, потому что метод увеличил аргумент z, который не существует вне метода.Вы можете написать метод следующим образом ...

int IncrementIfEqual(string x, string y, int z)
{
    return (x == y) ? ++z : z;
}

, который увеличивает значение z и возвращает его, если x и y равны, в противном случае он просто возвращает исходное значение, переданное в.Затем вы могли бы назвать это так ...

variable1 = IncrementIfEqual(cellValue.ToString().Substring(0, 1), "1", variable1)

В таком случае, лямбда-выражение, которое вам нужно, это ...

(x, y, z) => { return (x == y) ? ++z : z; }

Я не уверен, чтоDelegateName есть, но если у него есть метод Invoke (), ваше полное использование может выглядеть примерно так ...

DelegateName tally = (x, y, z) => { if (x == y) z++; };
variable1 = tally.Invoke(cellValue.ToString().Substring(0, 1), "1", variable1)
0 голосов
/ 30 января 2019

Ваш variable1 является int ( типом значения ), поэтому, когда вы передаете его в качестве аргумента, вы фактически передаете его значение, поэтому внутри вашей tally лямбды будет другая int переменная z, которая не зависит от variable1.Итак, когда вы делаете z++ внутри tally, ваш variable1 не меняется.

Если ваш tally определен около variable1, вы можете просто использовать его внутри своей лямбды:

var variable1 = 0;
DelegateName tally = (x, y) => { if (x == y) variable1++; };

foreach (var cellValue in cells)
     tally(cellValue.ToString().SubString(0,1), "1");

Другим способом является LINQ :

using System.Linq;

var variable1 = cells.Select(c => c.ToString().FirstOrDefault()).Count(c => c == '1');
// or even better (thx @RufusL)
var variable2 = cells.Count(c => c.ToString().StartsWith("1"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...