2015-03-05 6 views
0

Это как определяется пользовательский объект:Сравнение двух списков объектов одного и того же типа

public class AccountDomain 
{ 
    public string MAILDOMAIN { get; set; } 
    public string ORG_NAME { get; set; } 
} 

Это как я наполнении Перечень объектов:

List<AccountDomain> mainDBAccountDomain = mainDB.GetAllAccountsAndDomains(); 
    List<AccountDomain> manageEngineAccountDomain = ManageEngine.GetAllAccountsAndDomains(); 

Этот код работает нормально - если я смотрю на локальные окна, я могу увидеть список объектов в mainDBAccountDomain и manageEngineAccountDomain.

я борюсь с следующим битом, в идеале я хочу новый список типа AccountDomain, который содержит все элементы, которые находятся в mainDBAccountDomain и не ManageEngineAccountDomain

Любой помощь очень ценится, даже если это просто указатель в правильном направлении!

ответ

1

Я хочу, чтобы новый список типа AccountDomain, который содержит все элементы, которые находятся в mainDBAccountDomain и не ManageEngineAccountDomain

Это очень просто с помощью LINQ к объектам, это именно то, что делает функция Enumerable.Except:

var result = mainDBAccountDomain.Except(manageEngineAccountDomain).ToList(); 

Вы можете сравнить их с функцией Except, если вам нужно что-то отличное от эталонного равенства, или вы c Equals и GetHashCode в AccountDomain (и, возможно, вместо них IEquatable<AccountDomain>).

См. this explanation, если вам нужна дополнительная информация о сравнителях.

Вот пример:

public class AccountDomainEqualityComparer : IEqualityComparer<AccountDomain> 
{ 
    public static readonly AccountDomainEqualityComparer Instance 
     = new AccountDomainEqualityComparer(); 

    private AccountDomainEqualityComparer() 
    { 
    } 

    public bool Equals(AccountDomain x, AccountDomain y) 
    { 
     if (ReferenceEquals(x, y)) 
      return true; 

     if (x == null || y == null) 
      return false; 

     return x.MAILDOMAIN == y.MAILDOMAIN 
      && x.ORG_NAME == y.ORG_NAME; 
    } 

    public int GetHashCode(AccountDomain obj) 
    { 
     if (obj == null) 
      return 0; 

     return (obj.MAILDOMAIN ?? string.Empty).GetHashCode() 
      ^(397 * (obj.ORG_NAME ?? string.Empty).GetHashCode()); 
    } 
} 

Затем вы используете это так:

var result = mainDBAccountDomain.Except(manageEngineAccountDomain, 
             AccountDomainEqualityComparer.Instance) 
           .ToList(); 
+0

В настоящее время mainDBAccountDomain имеет 454 объектов и manageEngineAccountDomain имеет 3. 3 матча 3 объекта в mainDBAccountDomain. Я попробовал это, и мой результат имеет 454 объекта, которые предполагают, что это не сработало, я бы ожидал 451 в результатах. – Trinitrotoluene

+0

Кажется, что все в порядке - я понятия не имел, что это окажется сложным, и у меня не было бы шанса. Спасибо – Trinitrotoluene

+0

На самом деле это было бы намного проще, если бы вы использовали что-то вроде 'Tuple ' (но менее читаемое). Или ReSharper, который может сгенерировать этот шаблонный код для вас в кратчайшие сроки. Переопределение 'Equals' /' GetHashCode', как описано [здесь] (http://stackoverflow.com/questions/24595711/how-create-class-that-i-can-define-that-is-a-key-in- словарь/24595967 # 24595967) также потребуется меньше кода. Дело в том, что вам нужен код, который сообщает, что * «два объекта равны» * означает для ваших объектов. –

Смежные вопросы