2014-10-26 72 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

相關問題