2011-01-21 5 views
0

У меня есть класс Сотрудник со свойствами Имя и идентификаторКак сравнить массивы?

У меня есть массив Employee [] A другой массив Employee [] B. Как сравнить два массива и удалить значения, не присутствующие в B из?

+0

оффтоп: Странный тег «C# -4,0». Может быть, «C# 4.0»? : - \ – SeeSharp

+0

@SeeSharp: Это общий тег для C# 4.0. – jason

+0

Вы имеете в виду свойство вместо атрибута? – Simon

ответ

7
var intersection = A.Intersect(B).ToArray(); 

Обратите внимание, что это используется по умолчанию IEqualityComparer<Employee>, который просто будет ссылочный сравнение, если вы не переопределены Equals и GetHashCode. В качестве альтернативы вы можете реализовать IEqualityComparer<Employee> и использовать перегрузку Intersect, которая принимает, например, IEqualityComparer<Employee>.

+0

Я сделал это для B i'm, имеющего {API.Employee [9]} и + для A \t API.Employess [1], и есть действительно один общий массив, так как нет пересечения. – learning

+0

Вы реализовали IEqualityComparer, как предложил Джейсон? –

0

Можете ли вы использовать System.Collections.Generic?

Я хотел бы сделать что-то вроде:

var listA = new List<Employee>(A); 
var listB = new List<Employee>(B); //not sure if arrays implement contains, may not need this line 

A = listA.where(e => listB.Contains(e)).toArray(); 

Надежда, что помогает.

+0

Это 'O (n^2)'. – jason

0

Чтобы проиллюстрировать предложение Джейсона (сравнение на основе идентификаторов):

class IDEmployeeComparer : IEqualityComparer<Employee> 
{ 
    public bool Equals(Employee first, Employee second) 
    { 
     return (first.ID == second.ID); 
    } 

    public int GetHashCode(Employee employee) 
    { 
     return employee.ID 
    } 
} 

...

var intersection = A.Intersect(B, new IDEmployeeComparer()).ToArray(); 

Jon Skeet's misc library позволяет задать компаратор инлайн без необходимости создавать отдельный класс

0
Employee[] c = (from d in a where !b.Contains<Employee>(d) select d).ToArray<Employee>(); 
Смежные вопросы