2016-07-29 25 views
1

我有三个集合:CandidateList,GroupList和PositionList。 我想知道在某个位置是否有单个候选人,以及该位置是否有该特定组的候选人。 它是这样的:如何在三个集合中进行LINQ?

candidateList = RetrieveCandidates(); 
groupList = RetrieveGroups(); 
positionList = RetrievePositions(); 

//first I loop through the candidates if there is at 
//least 1 candidate per position, INCLUDING THE INDEPENDENT CANDIDATES. 


foreach (var pos in positionList) 
{ 
    bool exists = candidateList.Any(x => x.PositionId == pos.PositionId) 

    if(!exists) 
    { 
     //throw exception 
    } 

} 

//then I loop through the groups if there is at least 1 candidate per position. 
//This will make sure that all positions for each group has a member. 

foreach (var grp in groupList) 
{ 
    foreach (var pos in positionList) 
    { 
     bool exists = candidateList.Any(x => x.PositionId == pos.PositionId && x.GroupId == grp.GroupId) 

     if(!exists) 
     { 
      //throw exception 
     } 
    } 
} 

是有,我可以简化代码的方法吗?优选LINQ

编辑:我忘了提关于谁是独立的候选人(candidate.CandidateId == 0)

回答

1

你的第一个检查可以简化为:

var exists = positionList.All(p=> candidateList.Any(c=>c.PositionId == p.PositionId)); 

从那里,我们可以创建你的第二个支票

exists = groups.All(
       g =>positionList.All(
        p=> candidateList.Any(
          c=>c.PositionId == p.PositionId && c.GroupId == g.GroupId))); 
1
candidateList.Where(c=>positionList.Any(pos=>pos.PositionId == c.PositionId) 
     && groupList.Any(g=>g.GroupId == c.GroupId)) 

将过滤谁具有不同于两个列表的至少一个位置和组候选。

1

不需要的第一条语句,如果第二个说法是正确的,如果每个组至少一个候补的位置则有至少有一位候选人的位置,所以你刚需的LINQ IFY你的第二个声明

positionList.All(pos=> 
     groupList.All(grp=> 
      canidateList.Any(can=> can.PositionId==pos.PositionId 
            && can.GroupId == grp.GroupId))); 

不过,看你也正在做例外处理两种不同的情况,所以你可以作出这样的选择不具有匹配组一个匿名对象并检查考生以及

var result = 
    positionList.Select(pos=>new { 
     Position = pos, 
     DoesNotHaveOneCanidate = 
      !canidateList.Any(can=> can.PositionId==pos.PositionId), 
     GroupsMissing = 
      groupList.Where(grp=> 
       !canidateList.Any(can=> can.PositionId==pos.PositionId 
            && can.GroupId == grp.GroupId) 
      ) 
    });