2012-07-17 24 views
0

对不起,我有点新的LINQ,但我认为这就是我需要帮助...使用LINQ加入对象的名单,其ID

我有对象的列表 - 员工的任务 - 并且它具有专业知识领域,作为员工对象中的整数列表。我需要能够筛选仅限具有某些专业领域的员工名单。但是,我也希望能够通过他们匹配的专业领域来对员工进行排名。

我的想法是用(EmployeeID,Tag)为每个员工标签创建一个条目,然后将其与我的搜索列表一起加入,然后通过员工ID汇总,计数标签,然后按计数降序排序。

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

我主要有:

员工

  • 雇员为整数
  • AreasOfExpertise为(的整数)名单

,我想员工ID列表和AreaOfExpertiseID一个进入每个员工专业领域。

有人知道我该怎么做吗?

谢谢

+1

太多的阅读,只有你知道的特殊术语太多(例如_“专家的雇员区域”),因此太抽象了。显示你的班级和2-3个样本对象。也很难看到真正的问题或期望的输出是什么。 – 2012-07-17 20:57:50

回答

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

谢谢 - 这非常有帮助。我最终使用了一种稍微不同的方法,但是您的帖子非常丰富。 – Mike 2012-07-17 23:30:36

+0

@Mike - 不要忘了接受答案,如果它帮助你解决了你的问题。 – GunnerL3510 2012-07-18 01:13:06

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是,可能会对你有所帮助

干杯联接语法的另一个很好的例子,

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 

谢谢大家的帮助!