2015-11-15 6 views
1

У меня есть простой класс в C#:Как сравнить два списка объектов?

public class Customer 
{ 
    public string CustomerName { get; set; } 
    public int CustomerId { get; set; } 
    public int RegionId { get; set; } 
} 

Клиенты сохраняются в списке customersâ и, кроме того у меня есть второй с List CustomersB. CustomersB - это «Истина».

Мне нужно узнать

  • клиентов в CustomersB, но не в customersâ (по CustomerID)
  • клиентов в customersâ, но не в CustomersB (по CustomerID) (то же самое, что и выше)
  • клиентов в CustomerB также с тем же CustomerID в CustomerA, но с другим CustomerName

Как я могу достичь этого с помощью C#?

+6

Предлагаю вам ознакомиться с LINQ - это делает все так просто. Затем вы можете попробовать это для себя и задать более конкретный вопрос, включая то, что вы пробовали, и проблемы, с которыми вы столкнулись. –

ответ

4

Вы должны использовать LINQ для операций набора данных:

• клиентов в CustomersB, но не в customersâ (по CustomerID)

var query = customersB.Where(cB => !customersA.Any(cA => cA.Id == cB.Id)).ToList(); 

• клиентов в customersâ, но не в CustomersB (по CustomerID)

var query = customersA.Where(cA => !customersB.Any(cB => cB.Id == cA.Id)).ToList(); 

• клиенты в CustomerB также имеют одинаковый идентификатор клиента в CustomerA, но разные CustomerName

var query = customersB.Where(cB => customersA.Any(cA => cA.Id == cB.Id 
                && cA.CustomerName != cB.CustomerName)) 
         .ToList(); 
+0

Я отметил, но я думаю, что технически ** Пользователь вопроса ** должен изменить ** название вопроса ** .... это не совсем ** сравнение объектов ** его более запросов объектов для ** фильтрации **. – Seabizkit

+0

@Seabizkit Это сравнение двух наборов для их фильтрации. Ничего плохого в заголовке вопроса. –

+0

lol кто-то еще уже его модифицировал - меня за победу – Seabizkit

2

Если вы планируете проводить эти сопоставления в нескольких местах, вы также можете создать пользовательский EqualityComparer<Customer> и повторно использовать их везде, где это необходимо.

Это пример двух сопоставлений, основанных на Идентификаторе, а другой - на Идентификаторе и имени. Я собираюсь взять на себя идентификатор клиента является уникальным в этом примере:

public sealed class CustomerByIdEqualityComparer : IEqualityComparer<Customer> 
{ 
    public bool Equals(Customer x, Customer y) 
    { 
     if (ReferenceEquals(x, y)) return true; 
     if (ReferenceEquals(x, null)) return false; 
     if (ReferenceEquals(y, null)) return false; 
     if (x.GetType() != y.GetType()) return false; 
     return x.CustomerId == y.CustomerId; 
    } 

    public int GetHashCode(Customer obj) 
    { 
     return obj.CustomerId; 
    } 
} 

public sealed class CustomerByIdAndNameEqualityComparer : IEqualityComparer<Customer> 
{ 
    public bool Equals(Customer x, Customer y) 
    { 
     if (ReferenceEquals(x, y)) return true; 
     if (ReferenceEquals(x, null)) return false; 
     if (ReferenceEquals(y, null)) return false; 
     if (x.GetType() != y.GetType()) return false; 
     return !string.Equals(x.CustomerName, y.CustomerName) && 
       x.CustomerId == y.CustomerId; 
    } 

    public int GetHashCode(Customer obj) 
    { 
     return obj.CustomerId; 
    } 
} 

И вы потребляете их с помощью Enumerable.Except:

var comparerById = new CustomerByIdEqualityComparer(); 
var comparerByIdAndName = new CustomerByIdAndNameEqualityComparer(); 

var customerARelativeComplement = customersA.Except(customersB, comparerById); 
var customerBRelativeComplement = customersB.Except(customersA, comparerById); 
var customersBRelativeComplementByName = customersB 
             .Except(customersA, comparerByIdAndName); 

Если вы работаете с большими наборами, рассмотреть возможность использования HashSet<T> сделать фильтрация. Только проблема заключается в том, что вы можете передать только один EqualityComparer<T>, и вы будете связаны с ним.

+0

Дерьмо, я заканчивал свой ответ в основном тем же текстом; P –

+0

@ MatíasFidemraizer LOL, извините: X –

+1

NooooooOOOOOOooooooooo !! Вы украли мои очки! Нет, это шутка: D –

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