获得两个列表之间的不同行

时间:2014-10-26 22:36:32

标签: c#

我在这里有这个代码,用于查找两个列表之间的差异行,并将它们添加到另一个列表中,如下所示;

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
                }
            );
        }
    }
}

我收到此错误。 收集被修改;枚举操作可能无法执行。

我如何修复它,我尝试了除了两个列表之间的差异,并没有工作。

2 个答案:

答案 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();
    }
}