基于Name和ComputerName从Dictionary中获取唯一Task对象的Linq实现
修正你的Task筛选代码
咱们先聊聊你原来代码的问题:
- 你用
Select之后,得到的是一堆IEnumerable<Task>的集合(每个分组里符合条件的Task列表),而不是你想要的单个Task对象 - 没有把所有分组里的Task合并成一个统一的序列来筛选,也没处理“唯一匹配”的逻辑
给你调整后的代码,完美实现需求:
// 先定义要匹配的目标值(注意别和查询变量重名) var targetName = "你要找的Task名称"; var targetComputerName = "你要找的计算机名称"; // 平铺所有分组的Task,筛选后获取唯一匹配项 var matchedTask = Dictio.Values .SelectMany(group => group.Tasks) // 把所有分组里的Task合并成一个序列 .SingleOrDefault(task => task.Name == targetName && task.ComputerName == targetComputerName);
代码解释:
Dictio.Values:直接取字典里所有的Grouped对象,不需要关心字典的键SelectMany:这是关键!它会把每个Grouped里的Tasks集合拆解开,合并成一个连续的Task序列,代替你原来的Select(Select会保留每个独立的集合,没法直接筛选单个Task)SingleOrDefault:因为你的需求是Name+ComputerName组合唯一对应一个Task,这个方法正好适配:- 找到正好一个匹配的Task,就返回它
- 没找到匹配项,返回
null - 如果找到多个匹配项(说明数据不符合你的“唯一”约定),会抛出异常,帮你快速发现数据问题
如果你不想因为多个匹配项抛出异常,也可以用FirstOrDefault返回第一个匹配的,但更推荐SingleOrDefault来保证数据符合预期哦。
内容的提问来源于stack exchange,提问作者Hyro
相关产品推荐
相关产品推荐

