抱歉,我对linq有点新意,但我认为这就是我需要的帮助...
我有一个对象列表 - 一个任务的员工 - 它有一些专业领域作为员工对象中的整数列表。我需要能够仅针对具有某些专业领域的人员过滤员工列表。但是,我也希望能够根据他们匹配的专业领域对员工进行排名。
我的想法是创建一个包含(EmployeeID,Tag)的列表,每个员工标签都有一个条目,然后将其与我的搜索列表连接,然后按员工ID,计数标签聚合,然后按计数降序排序。
但是,我不知道如何创建该列表。我如何获得(EmployeeID,Tag)列表?
我基本上有:
员工
我想要一份员工ID和AreaOfExpertiseID列表,每个员工的专业领域都有一个条目。
有人知道我该怎么做吗?
由于
答案 0 :(得分:1)
这是你正在寻找的那种东西吗?这将创建一个具有2个属性的匿名类型,但这可以很容易地成为您想要的类型。
var employees = new List<int>() { 1,2,3,4,5};
var skills = new List<KeyValuePair<int, string>>()
{
new KeyValuePair<int, String>(1, "test"),
new KeyValuePair<int, string>(3, "test3"),
new KeyValuePair<int, string>(3, "test4")
};
var list =
(
from employee in employees
join skill in skills
on employee equals skill.Key
select new { employee, skill.Value }
).ToList();
编辑: 如果没有关于您的代码当前是什么的更多信息,我只是猜测了一些类型,这些类型将显示如何访问属性并进行连接。如果您更新,我很乐意根据您的需求进行更新。
Here是另一个可能对您有帮助的联接语法的好例子
干杯,
答案 1 :(得分:0)
这是你在找什么?
var emplist = new List<Employee>
{
new Employee { EmployeeId = 1, AreaOfExpertieseId = new List<int>() { 1, 2, 3, 4 } },
new Employee { EmployeeId = 2, AreaOfExpertieseId = new List<int>() { 1, 2 } },
new Employee { EmployeeId = 3, AreaOfExpertieseId = new List<int>() },
new Employee { EmployeeId = 4, AreaOfExpertieseId = new List<int>() { 1,4 } },
};
var expertiseId = new[] {2,3}; //ExpertiseIds you want to search;
var emps = emplist.Where(e => e.AreaOfExpertieseId.Exists(id => expertiseId.Contains(id)))
.Select(e => new {e.EmployeeId, Rank = e.AreaOfExpertieseId.Count }).ToList();
答案 2 :(得分:0)
我最终在这里做了与答案有关的事情,但略有不同。对不起,这是我的错,我对此有点新,并没有提供有用的信息。我有这个:
Class Employee
Public EmployeeID as Integer
Public Skills as list(of Integer)
End Class
'Should turn a list of EmployeeID, MatchingSkillCount
Function FindEmployeesWithMatchingSkills(Employees as List(of Employee), SearchSkills as List(of Integer)) as IEnumerable(of KeyValuePair(of Integer, Integer))
End Function
但是,我无法理解。在一点帮助下,我想出了这个,这似乎有用:
Function FindEmployeesWithMatchingSkills(Employees as List(of Employee), SearchSkills as List(of Integer)) as IEnumerable(of KeyValuePair(of Integer, Integer))
Return (From e in Employees Select New KeyValuePair(Of Integer, Integer)(e.EmployeeID, e.Skills.Where(Function(s) SearchSkills.Contains(s)).Count)).OrderByDescending(Function(kvp) kvp.Value).Where(Function(kvp) kvp.Value > 0)
End Function
谢谢大家的帮助!