如果我在循环外启动临时列表,我希望会发生这种情况,但是我不是这样,不明白为什么我得到了结果。我的代码本质上是:
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(),但是在循环的第一遍添加的记录都被更新为第二遍的值。循环-最终结果是我列表中的重复数据!
我感觉到我缺少明显的东西,但这已经是漫长的一天,只是无法弄清。
答案 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