更改添加到列表的项目(AddRange)更改添加到AddRange的表

时间:2019-01-28 23:11:56

标签: c# list foreach reference

如果我在循环外启动临时列表,我希望会发生这种情况,但是我不是这样,不明白为什么我得到了结果。我的代码本质上是:

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循环的每个遍历中,我都创建一个名为tempTable的新List<IITemData>。我用一种方法填充它,然后再添加一些其他方法,然后将其添加到另一个名为itemDataList的列表的范围中。

我首先在循环内启动了tempTable列表,并在应用于主列表时也使用了ToList(),但是在循环的第一遍添加的记录都被更新为第二遍的值。循环-最终结果是我列表中的重复数据!

我感觉到我缺少明显的东西,但这已经是漫长的一天,只是无法弄清。

1 个答案:

答案 0 :(得分:1)

所以我不确定100%,但是看起来您正在foreach循环的每个遍历中重复使用“ item”对象,您在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