【问题标题】:Linq Count ExpressionLinq 计数表达式
【发布时间】:2011-06-23 23:12:45
【问题描述】:

假设以下 Employee 类(是的,我知道我不应该公开 Lists,但这只是一个示例):

class Employee
{
    public string Name {get; set;}
    public List<string> Skills {get; set;}
}

技能只是员工拥有的技能列表,例如“编程”、“客户服务”等。

现在假设我有一个List&lt;Employee&gt; CurrentEmployees,而且我还有另一个员工Employee NewHire,它不在CurrentEmployees 列表中。

我的目标是使用 lambda 表达式来计算 CurrentEmployees 中有多少员工至少拥有 NewHire 也拥有的一项技能。例如,如果CurrentEmployees 包含一个员工Skills{'Programming', 'Troubleshooting'},另一个员工Skills{'Accounting','Finance'},而NewHire 有Skills{'Programming','Networking'},我想要一个返回1 的表达式,因为列表中的第一个员工也有'编程”作为一种技能……这可能吗?

感谢您的帮助。

【问题讨论】:

    标签: c# linq lambda


    【解决方案1】:
     currentEmployees.Count(ce =>
                   ce.Skills.Intersect(newHire.Skills).Any())
    

    【讨论】:

      【解决方案2】:
      var currentEmployees = new List<Employee>
      {
          new Employee { Skills = new List<string> { "Programming", "Troubleshooting" } },
          new Employee { Skills = new List<string> { "Accounting", "Finance" } },
      };
      
      var newHire = new Employee { Skills = new List<string> { "Programming", "Networking" } };
      
      var count = currentEmployees.Count(e => e.Skills.Any(newHire.Skills.Contains));
      // count == 1
      

      【讨论】:

      • 谢谢。你能给我一个简短的解释吗?我对 newHire.Skills.Contains 部分特别感兴趣。
      • @Andrew:这是一个方法组,get 被隐式翻译成x =&gt; newHire.Skills.Contains(x)
      • @sehe,这不完全正确。例如,您不能将方法组转换为 Expression,但您可以使用 lambda 来做到这一点。方法组隐式转换为委托,lambda 也可以隐式转换为委托,但这并不意味着方法组首先转换为 lambda。
      • @sehe,是的,但这并不意味着你应该说不正确的话。
      • (你为什么不发表建设性的解释,我会删除我的)
      【解决方案3】:

      如果性能很重要,我会使用HashSet&lt;string&gt;

      var newHireSkills = new HashSet<string>(newHire.Skills);
      
      var count = currentEmployees.Count(e => e.Skills.Any(s => newHireSkills.Contains(s)));
      

      【讨论】:

      • +1 但是,除非人们的技能太多,或者公司是China Inc.,否则应该没问题。同时,添加new HashSet&lt;string&gt;(newHire.Skills, StringComparer.CurrentCultureIgnoreCase) 以拥有高效、不区分大小写 技能集:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多