我在这里有这个代码,用于查找两个列表之间的差异行,并将它们添加到另一个列表中,如下所示;
List<xml.DatabaseDescriptor> dbDesc = _dbDesc.ToList();
foreach (xml.DatabaseDescriptor desc1 in dbDesc)
{
foreach (xml.DatabaseDescriptor desc2 in xmlData.Databases)
{
if (desc1.Name != desc2.Name)
{
xmlData.Databases.Add(
new xml.DatabaseDescriptor() {
DatabaseName = desc1.Name, Tables = newTable
}
);
}
}
}
我收到此错误。 收集被修改;枚举操作可能无法执行。
我如何修复它,我尝试了除了两个列表之间的差异,并没有工作。
答案 0 :(得分:1)
您无法修改正在迭代的集合。
如果要修改原始版本,则应迭代xmlData.Databases
的副本。
此外,您应该能够将LINQ与自定义比较器一起使用以获取两个列表的差异,然后将其添加到第一个列表中。
class DatabaseDescriptorComparer : IEqualityComparer<DatabaseDescriptor>
{
public bool Equals(DatabaseDescriptor x, DatabaseDescriptor y)
{
return
x.Name == y.Name;
}
public int GetHashCode(DatabaseDescriptor obj)
{
return obj.Name.GetHashCode();
}
}
然后使用它:
var toAdd = dbDesc.Except(xmlData, new DatabaseDescriptorComparer() ).ToList();
foreach(var x in toAdd){
xmlData.Databases.Add(
new xml.DatabaseDescriptor() { DatabaseName = x.Name, Tables = newTable }
);
}
答案 1 :(得分:0)
首先创建两个枚举的并集,然后通过取消比较decriptor名称的比较器来获取唯一的描述符:
List<DatabaseDescriptor> result = _dbDesc
.Union(xmlData.Databases)
.Distinct(DatabaseDescriptorNameComparer.Instance)
.ToList();
我正在使用这个比较器的单例模式:
class DatabaseDescriptorNameComparer : IEqualityComparer<DatabaseDescriptor>
{
public static readonly DatabaseDescriptorNameComparer Instance =
new DatabaseDescriptorNameComparer();
private DatabaseDescriptorNameComparer()
{
}
public bool Equals(DatabaseDescriptor x, DatabaseDescriptor y)
{
return x.Name == y.Name;
}
public int GetHashCode(DatabaseDescriptor obj)
{
return obj.Name.GetHashCode();
}
}