Как изменить значение переменной в дочернем элементе вложенного списка - PullRequest
1 голос
/ 07 февраля 2020

Будучи новым, довольно новым для сущности, LINQ и C#, я не уверен, как изменить значение переменной во вложенном списке. Я знаю, что LINQ не предназначен для обновления объектов , но я где-то читал, что вы можете это как-то сделать, и это то, что я пытаюсь здесь. Я доволен любым решением.

Предположим, у нас есть два списка, myData с данными текущего месяца и myDataBefore с тем же списком из предыдущего месяца. Я хочу обновить myData. Более конкретно, я хочу изменить (в SQL вы бы сказали UPDATE) valuePrevMonth и deltaPercentage для всех детей 1-го уровня в этом списке - все остальное должно остаться без изменений. Я попробовал следующее, но это не дает желаемого эффекта.

var myChildren = myData.SelectMany(x => x.children).ToList();
foreach (var child in myChildren)
  {
     var valuePrevMonth = myDataBefore.SelectMany(x => x.children)
                           .Where(x => (x.PositionId == child.PositionId && 
                                        x.SubPositionId == child.SubPositionId))
                           .Select(x => x.Value).FirstOrDefault();
     // now comes the write-back step which I am probably messing up
     myData.SelectMany(x => x.children)
            .Where(x => (x.PositionId == child.PositionId &&
                         x.SubPositionId == child.SubPositionId))
            .Select(x => { 
                 x.previousValue = valuePrevMonth;
                 x.deltaPercentage = (x.Value - valuePrevMonth) / valuePrevMonth; // probably some IF-NULL check would not hurt
                 return x;
               }).ToList();
  }

Последнее .Select(..) - мое текущее понимание того, как обновить эти два значения данного дочернего объекта.

Некоторый фон

Мой вложенный список List<myData> имеет следующий формат (пожалуйста, позвольте мне использовать какой-то псевдокод для определения):

myData 
    {
        int? PositionId 
        string PositionName 
        int SubPositionId 
        string SubPositionName
        myObject children 
        decimal? Value
        decimal? previousValue 
        decimal? deltaPercentage 
    }

Ссылки

1 Ответ

1 голос
/ 07 февраля 2020

Моя первая мысль: ваше второе утверждение, начинающееся с .SelectMany(x => x.Children), может быть ненужным; если я правильно читаю, то, что вы хотите обновить, уже находится в переменной child, поэтому вы просто должны сделать:

child.previousValue = valuePrevMonth;
...

Тем не менее, может иметь значение, является ли ваш тип myObject struct или class; если это struct, обновление его полей не будет делать то, что вы хотите, потому что вы будете работать с копией. Чтобы обновить элементы списка struct s, вы должны получить обновленное значение struct, которое вы хотите (например, установив поля в копии значения), а затем обновить весь элемент списка с помощью list[x] = updatedValue; .

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