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属性不同),它将不起作用-除非您使用自定义比较器在answerUseobj.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();
}
}