Элементы, добавленные в список (AddRange), изменяются при изменении таблицы, добавленной в AddRange. - PullRequest
0 голосов
/ 29 января 2019

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

foreach (DataRow dtRow in dt.Rows)
{
    List<IItemData> tempTable = new List<IItemData>();
    tempTable = CreateCopyOfTemplate(item, new List<IItemData>(), tableTemplate, itemDataList, item.Id, tableSortOrder);

    foreach (IItemData itemData in tempTable)
    {
        if (itemData.Content.StartsWith("cdt:") && itemData.DataSource.Description == nameof(DataSource.CustomDataTableValue))
        {
            itemData.Content = dtRow[itemData.Content.Replace("cdt:", "")].ToString();
        }
    }

    tableSortOrder++;
    itemDataList.AddRange(tempTable.ToList());
}


private static List<IItemData> CreateCopyOfTemplate(IItemData itemData, List<IItemData> newTable, List<IItemData> templateTable, List<IItemData> originalTable, int? origParentId, int tableSortOrder)
{
    List<IItemData> childList = templateTable.Where(x => x.ParentId == origParentId).ToList();

    if (itemData.DataSource != null && itemData.DataSource.Description == nameof(DataSource.CustomDataTable))
    {
        itemData.Id = originalTable.Max(x => x.Id) + 1;
        itemData.SortOrder = tableSortOrder;
        newTable.Add(itemData);
    }

    foreach (IItemData childItem in childList)
    {
        origParentId = childItem.Id;
        childItem.ParentId = itemData.Id;
        childItem.Id = newTable.Max(x => x.Id) + 1;
        newTable.Add(childItem);

        CreateCopyOfTemplate(childItem, newTable, templateTable, originalTable, origParentId, tableSortOrder);
    }

    return newTable;
}

Где на каждом проходе цикла ForEach я создаю новый List<IITemData> с именем tempTable.Я заполняю это методом, несколькими другими битами, а затем добавляю его в диапазон другого списка с именем itemDataList.

Сначала я инициировал список tempTable в цикле, а также использовал ToList () при применении кОднако в главном списке все записи, добавленные на первом проходе цикла, обновляются значениями второго прохода цикла, что приводит к дублированию данных в моем списке!

У меня такое чувство, что яупустить что-то очевидное, но это был долгий день, и я просто не могу этого понять.

1 Ответ

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

Так что я не уверен на 100%, но похоже, что вы повторно используете объект "item" на каждом проходе цикла foreach, вы вносите в него некоторые изменения в CreateCopyOfTemplate, а затем добавляете его в newTable и возвращаете его,Только чтобы передать его снова, внесите некоторые изменения и верните его.В конечном счете, используя ту же ссылку

if (itemData.DataSource != null && itemData.DataSource.Description == nameof(DataSource.CustomDataTable))
{

    itemData.Id = originalTable.Max(x => x.Id) + 1;
    itemData.SortOrder = tableSortOrder;
    newTable.Add(itemData); <-- Here you keep adding the same item
}

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

Смотрите здесь: https://docs.microsoft.com/en-us/dotnet/api/system.object.memberwiseclone?view=netframework-4.7.2

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