Linq Count Выражение

Предположим, следующий класс Employee (да, я знаю, что не должен публично раскрывать списки, но это только пример):

class Employee
{
    public string Name {get; set;}
    public List<string> Skills {get; set;}
}

Навыки - это просто список навыков, которыми обладает сотрудник, например, "программирование", "обслуживание клиентов" и т. Д.

Теперь предположим, что у меня есть List<Employee> CurrentEmployeesи у меня есть еще один сотрудник, Employee NewHire это не в CurrentEmployees список.

Моя цель - использовать лямбда-выражение, чтобы подсчитать, сколько сотрудников в CurrentEmployees иметь по крайней мере один навык, который NewHire также имеет. Так, например, если CurrentEmployees содержит один сотрудник с Skills{'Programming', 'Troubleshooting'}и еще один сотрудник с Skills{'Accounting','Finance'}и NewHire имеет Skills{'Programming','Networking'}, Я хотел бы получить выражение, которое возвращает 1, потому что первый сотрудник в списке также имеет "Программирование" в качестве навыка... это возможно?

Спасибо за любую помощь.

3 ответа

Решение
 currentEmployees.Count(ce =>
               ce.Skills.Intersect(newHire.Skills).Any())
var currentEmployees = new List<Employee>
{
    new Employee { Skills = new List<string> { "Programming", "Troubleshooting" } },
    new Employee { Skills = new List<string> { "Accounting", "Finance" } },
};

var newHire = new Employee { Skills = new List<string> { "Programming", "Networking" } };

var count = currentEmployees.Count(e => e.Skills.Any(newHire.Skills.Contains));
// count == 1

Если бы производительность была важна, я бы использовал HashSet<string>:

var newHireSkills = new HashSet<string>(newHire.Skills);

var count = currentEmployees.Count(e => e.Skills.Any(s => newHireSkills.Contains(s)));
Другие вопросы по тегам