C# 在两个列表之间获取不同的行

C# 在两个列表之间获取不同的行,c#,C#,我这里有一段代码,我用它来查找两个列表之间的不同行,并将它们添加到另一个列表中,如下所示 List<xml.DatabaseDescriptor> dbDesc = _dbDesc.ToList(); foreach (xml.DatabaseDescriptor desc1 in dbDesc) { foreach (xml.DatabaseDescriptor desc2 in xmlData.Databases) { if (desc1.Name

我这里有一段代码,我用它来查找两个列表之间的不同行,并将它们添加到另一个列表中,如下所示

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
                }
            );
        }
    }
}
List dbDesc=_dbDesc.ToList();
foreach(dbDesc中的xml.DatabaseDescriptor desc1)
{
foreach(xmlData.Databases中的xml.DatabaseDescriptor desc2)
{
if(desc1.Name!=desc2.Name)
{
xmlData.Databases.Add(
新的xml.DatabaseDescriptor(){
DatabaseName=desc1.Name,Tables=newTable
}
);
}
}
}
不过,我有这个错误。 收集被修改;枚举操作不能执行


如何修复它,我尝试了Except以获得两个列表之间的差异,但没有成功。

您不能修改正在迭代的集合

如果要修改原始数据库,应在
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();
    }
}

首先创建两个枚举的并集,然后通过取消匹配比较描述符名称的比较器来获取唯一描述符:

List<DatabaseDescriptor> result = _dbDesc
    .Union(xmlData.Databases)
    .Distinct(DatabaseDescriptorNameComparer.Instance)
    .ToList();
列表结果=\u 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();
    }
}
class DatabaseDescriptorNameComparer:IEqualityComparer
{
公共静态只读DatabaseDescriptorNameComparer实例=
新数据库描述符rnameComparer();
专用数据库描述符RNAMeComparer()
{
}
公共bool等于(数据库描述符x、数据库描述符y)
{
返回x.Name==y.Name;
}
public int GetHashCode(数据库描述符obj)
{
返回obj.Name.GetHashCode();
}
}

…并将它们添加到另一个列表中
您的代码中没有另一个列表。即使您解决了此问题,您也有另一个列表:这将创建多达
dbDesc.Count*xmlData.Databases.Count
项!我提供了一个自定义比较器,它使用Name字段,请尝试一下。使用
除了
,这是一个好主意,但基于OPs标准(Name属性不同),它将不起作用-除非您使用自定义比较器在answerUse
obj.Name.GetHashCode()中还提供了比较器
为了与
Equals
保持一致。您好,非常感谢您的回复,我在toAdd:Instance参数中遇到了这个错误:无法从“System.Collections.Generic.List”转换为“System.Linq.iqueryable”谢谢,但这不起作用,结果列表仍然没有给出两个列表中唯一的行。为什么不呢?怎么回事?
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();
    }
}