C# 遍历字符串数组对比对象列表值及Lambda实现的最佳方式?
你提供的原有代码存在语法错误:allFolks是List<Folks>类型的集合,本身没有Name属性,Name是集合内单个Folks实例的属性,所以直接调用allFolks.Name会编译失败。
首先请确保你已经引入了LINQ命名空间,后续方案都需要依赖该命名空间:using System.Linq;
1. 基础Lambda实现(和原有逻辑对齐)
可以用LINQ的Any()方法搭配Lambda表达式完成匹配判断,代码如下:
var allFolks = Folks.GetAll(); string[] enteredNames = Array.ConvertAll(inputNames.Text.Split(','), p => p.Trim()); foreach (var eName in enteredNames) { // Lambda表达式f => f.Name == eName用于匹配符合条件的Folks实例 if (!allFolks.Any(f => f.Name == eName)) { throw new Exception("Name not found"); } }
如果需要忽略大小写对比姓名,可以把判断条件改成f.Name.Equals(eName, StringComparison.OrdinalIgnoreCase),避免大小写不同导致匹配失败。
2. 更简洁的无循环写法
如果不想显式写foreach循环,可以用LINQ的All()方法,一行完成所有姓名的校验:
if (!enteredNames.All(eName => allFolks.Any(f => f.Name == eName))) { throw new Exception("Name not found"); }
3. 大数据量下的性能优化方案
如果allFolks的元素数量较多,或者需要频繁做姓名匹配,建议提前把所有姓名提取为HashSet,把匹配的时间复杂度从O(n)降低到O(1),大幅提升性能:
// 提前构建姓名的哈希集合 var existingNameSet = new HashSet<string>(allFolks.Select(f => f.Name)); foreach (var eName in enteredNames) { if (!existingNameSet.Contains(eName)) { throw new Exception("Name not found"); } }
你问的Lambda表达式完全可以用于该场景,上面所有方案里=>标识的匿名函数都是Lambda表达式的用法。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

