2014-10-26 28 views
0

我有这里的代码,我用它来找到两个列表differt行,并将它们添加到另一个像下面;获得两个列表之间的不同行

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

'...并将它们添加到另一个'您的代码中没有*另一个*列表。 – Dmitry 2014-10-26 22:45:33

+0

即使你解决了这个问题,你还有另一个问题:这将创建最多dbDesc.Count * xmlData.Databases.Count项目! – 2014-10-26 22:56:11

+0

我提供了一个使用名称字段的自定义比较器,试试看。 – 2014-10-26 23:00:10

回答

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

使用'Except'的好主意,但它不会基于OPs标准(名称属性不同) - 除非你使用自定义比较器 – BrokenGlass 2014-10-26 22:46:32

+0

还提供了比较器在答案 – 2014-10-26 22:56:14

+0

使用'obj.Name.GetHashCode();'in为了与“Equals”保持一致。 – 2014-10-26 22:57:55

0

首先创建两个枚举的工会,然后通过unsing是比较decriptor名称的compararer采取独特的描述:

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(); 
    } 
} 
+0

谢谢,但这不起作用,结果列表仍然不会给我这两个列表中的唯一行。 – Mal 2014-10-27 07:04:30

+0

为什么不呢? Waht发生? – 2014-10-27 13:29:07

相关问题