【问题标题】:Use Linq to join an object's list with its ID使用 Linq 加入对象的列表及其 ID
【发布时间】:2012-07-17 20:50:25
【问题描述】:

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

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

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

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

我基本上有:

员工

  • EmployeeID 为整数
  • AreasOfExpertise 作为列表(整数)

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

有人知道我会怎么做吗?

谢谢

【问题讨论】:

  • 阅读太多,专业术语太多只有你知道(例如"employee area of​​ expertis"),太抽象了。展示您的班级和 2-3 个示例对象。也很难看出真正的问题或期望的输出是什么。

标签: asp.net vb.net linq


【解决方案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 是另一个很好的连接语法示例,可能对您有所帮助

干杯,

【讨论】:

    【解决方案2】:

    这是你要找的吗?

    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();
    

    【讨论】:

    • 谢谢 - 这很有帮助。我最终使用了一种略有不同的方法,但您的帖子内容丰富。
    • @Mike - 如果它帮助您或解决了您的问题,请不要忘记接受答案。
    【解决方案3】:

    我最终做了一些与这里的答案相关的事情,但略有不同。对不起,这是我的错,我对此有点陌生,没有提供有用的信息。我有这个:

    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
    

    感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-19
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      • 2012-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多