使用Linq以其ID加入对象的列表

时间:2012-07-17 20:50:25

标签: asp.net vb.net linq

抱歉,我对linq有点新意,但我认为这就是我需要的帮助...

我有一个对象列表 - 一个任务的员工 - 它有一些专业领域作为员工对象中的整数列表。我需要能够仅针对具有某些专业领域的人员过滤员工列表。但是,我也希望能够根据他们匹配的专业领域对员工进行排名。

我的想法是创建一个包含(EmployeeID,Tag)的列表,每个员工标签都有一个条目,然后将其与我的搜索列表连接,然后按员工ID,计数标签聚合,然后按计数降序排序。

但是,我不知道如何创建该列表。我如何获得(EmployeeID,Tag)列表?

我基本上有:

员工

  • EmployeeID as Integer
  • AreasOfExpertise as list(of Integer)

我想要一份员工ID和AreaOfExpertiseID列表,每个员工的专业领域都有一个条目。

有人知道我该怎么做吗?

由于

3 个答案:

答案 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

谢谢大家的帮助!