Member 13160027 Ответов: 2

"Невозможно неявно преобразовать тип 'void' в 'system.collections.generic.list<helptoearn.models.allpayouts>" При обновлении списка


Я должен ежедневно обновлять значения списка новыми значениями. новое значение-listvalue+newvalue

Что я уже пробовал:

allPayouts = (из p в allPayouts, где p.UserID == оплачено.UserID select p).ToList().ForEach((p) =>
{
п. LeftPoint = payoutList.Выберите(у =&ГТ; преобразование.Метод todouble(у.LeftPoint)).Метода firstordefault();
п. RightPoint += payoutList.Выберите(у =&ГТ; преобразование.Метод todouble(у.RightPoint)).Метода firstordefault();
п. BinaryIncome = payoutList.Выберите(у =&ГТ; у.BinaryIncome).Метода firstordefault();

});

Richard MacCutchan

Это просто означает, что ваш код LINQ не возвращает никаких элементов. Используйте свой отладчик, чтобы выяснить, почему.

2 Ответов

Рейтинг:
11

Richard Deeming

.ToList возвращает Список<T>[^].

Список Метод ForEach[^] выполняет указанное действие для каждого элемента в списке. Он ничего не возвращает.

Поэтому вы не можете присвоить возвращаемое значение (которого не существует) этого метода к вашей переменной.

Попробуй:

allPayouts = (from p in allPayouts where p.UserID == Paid.UserID select p).ToList();
allPayouts.ForEach(p =>
{
    p.LeftPoint = payoutList.Select(u => Convert.ToDouble(u.LeftPoint)).FirstOrDefault();
    p.RightPoint += payoutList.Select(u => Convert.ToDouble(u.RightPoint)).FirstOrDefault();
    p.BinaryIncome = payoutList.Select(u => u.BinaryIncome).FirstOrDefault();
}); 
Или, проще говоря:
allPayouts = (from p in allPayouts where p.UserID == Paid.UserID select p).ToList();
foreach (var p in allPayouts)
{
    p.LeftPoint = payoutList.Select(u => Convert.ToDouble(u.LeftPoint)).FirstOrDefault();
    p.RightPoint += payoutList.Select(u => Convert.ToDouble(u.RightPoint)).FirstOrDefault();
    p.BinaryIncome = payoutList.Select(u => u.BinaryIncome).FirstOrDefault();
}

NB: Значения, которые вы присваиваете в списке, похоже, не меняются. Вероятно, вы можете переместить эти вычисления за пределы цикла:
allPayouts = (from p in allPayouts where p.UserID == Paid.UserID select p).ToList();

var firstPayout = payoutList.FirstOrDefault();
double leftPoint = firstPayout == null ? default : Convert.ToDouble(firstPayout.LeftPoint);
double rightPoint = firstPayout == null ? default : Convert.ToDouble(firstPayout.RightPoint);
var binaryIncome = firstPayout == null ? default : firstPayout.BinaryIncome;

foreach (var p in allPayouts)
{
    p.LeftPoint = leftPoint;
    p.RightPoint += rightPoint;
    p.BinaryIncome = binaryIncome;
}


Рейтинг:
0

OriginalGriff

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании электронного письма: успешная компиляция означает, что вы написали электронное письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

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

Начните с рассмотрения того, что он делает, и как это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а он удваивает его и печатает ответ, то если ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
private int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поместите точку останова в первую строку метода и запустите приложение. Когда он достигнет точки останова, отладчик остановится и передаст управление вам. Теперь вы можете запускать свой код построчно (так называемый "одноступенчатый") и просматривать (или даже изменять) содержимое переменных по мере необходимости (черт возьми, вы даже можете изменить код и повторить попытку, если вам это нужно).
Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она действительно делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?
Надеюсь, это поможет вам определить, в какой части этого кода есть проблема и в чем она заключается.
Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!