Linq Count Expression

时间:2011-06-23 23:12:46

标签: c# linq lambda

假设以下Employee类(是的,我知道我不应公开公开列表,但这只是一个例子):

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

技能只是员工的技能列表,例如“编程”,“客户服务”等。

现在假设我有一个List<Employee> CurrentEmployees,我还有另一名员工,Employee NewHire不在CurrentEmployees列表中。

我的目标是使用lambda表达式来计算CurrentEmployees中至少有一项NewHire技能的员工的数量。例如,如果CurrentEmployees包含一名Skills{'Programming', 'Troubleshooting'}员工,另一名员工Skills{'Accounting','Finance'},而NewHire有Skills{'Programming','Networking'},我希望表达式返回1,因为列表中的第一名员工也将“编程”作为一种技能......这可能吗?

感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

 currentEmployees.Count(ce =>
               ce.Skills.Intersect(newHire.Skills).Any())

答案 2 :(得分:2)

如果表现很重要,我会使用HashSet<string>

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

var count = currentEmployees.Count(e => e.Skills.Any(s => newHireSkills.Contains(s)));