У меня есть класс Сотрудник со свойствами Имя и идентификаторКак сравнить массивы?
У меня есть массив Employee [] A другой массив Employee [] B. Как сравнить два массива и удалить значения, не присутствующие в B из?
У меня есть класс Сотрудник со свойствами Имя и идентификаторКак сравнить массивы?
У меня есть массив Employee [] A другой массив Employee [] B. Как сравнить два массива и удалить значения, не присутствующие в B из?
var intersection = A.Intersect(B).ToArray();
Обратите внимание, что это используется по умолчанию IEqualityComparer<Employee>
, который просто будет ссылочный сравнение, если вы не переопределены Equals
и GetHashCode
. В качестве альтернативы вы можете реализовать IEqualityComparer<Employee>
и использовать перегрузку Intersect
, которая принимает, например, IEqualityComparer<Employee>
.
Я сделал это для B i'm, имеющего {API.Employee [9]} и + для A \t API.Employess [1], и есть действительно один общий массив, так как нет пересечения. – learning
Вы реализовали IEqualityComparer, как предложил Джейсон? –
Можете ли вы использовать 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();
Надежда, что помогает.
Это 'O (n^2)'. – jason
Я думаю, вы можете найти какое-то вдохновение от http://msdn.microsoft.com/en-us/library/wdka673a.aspx aka RemoveAll()
. Вы должны поместить массивы в списки, но это не должно озадачить вас ...
Чтобы проиллюстрировать предложение Джейсона (сравнение на основе идентификаторов):
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 позволяет задать компаратор инлайн без необходимости создавать отдельный класс
Employee[] c = (from d in a where !b.Contains<Employee>(d) select d).ToArray<Employee>();
оффтоп: Странный тег «C# -4,0». Может быть, «C# 4.0»? : - \ – SeeSharp
@SeeSharp: Это общий тег для C# 4.0. – jason
Вы имеете в виду свойство вместо атрибута? – Simon