如何判断List<CardSetWithWordCount>的IsToggled状态并返回对应结果
用LINQ轻松实现你的需求,当然也可以用foreach!
完全可以用LINQ来实现这个逻辑,而且代码会非常简洁优雅,同时也能兼顾性能。咱们先来看LINQ的实现方式,再对比foreach的写法,你可以按需选择。
LINQ实现方案(推荐)
这里的关键是提前终止不必要的遍历——我们只需要知道是否有0、1或多个IsToggled=true的元素,不需要遍历整个列表。用Take(2)就能做到这一点,找到两个符合条件的元素后就停止遍历,效率很高:
public string GetSelectedCardSetName() { // 先处理列表为空的情况,避免空引用异常 if (cardSetWithWordCounts == null) return null; // 筛选出IsToggled为true的元素,最多取2个 var toggledItems = cardSetWithWordCounts .Where(item => item.IsToggled) .Take(2) .ToList(); // 根据数量返回对应结果 return toggledItems.Count switch { 0 => null, 1 => toggledItems[0].Name, _ => "mixed" }; }
为什么用Take(2)?
如果你的列表非常大,遍历全部元素会浪费性能。Take(2)会在找到第二个符合条件的元素后立即停止查询,和foreach里的break效果一样,但代码更简洁。
foreach实现方案
如果你更习惯传统的循环写法,也可以用foreach来实现,逻辑和LINQ是一致的:
public string GetSelectedCardSetName() { if (cardSetWithWordCounts == null) return null; int toggledCount = 0; string selectedName = null; foreach (var item in cardSetWithWordCounts) { if (item.IsToggled) { toggledCount++; selectedName = item.Name; // 一旦找到超过1个,直接跳出循环 if (toggledCount > 1) break; } } return toggledCount switch { 0 => null, 1 => selectedName, _ => "mixed" }; }
选择建议
- 优先选LINQ:代码更简洁、可读性更高,尤其是当逻辑复杂时,LINQ的声明式写法能让意图更清晰。而且
Take(2)的优化已经保证了性能不会比foreach差。 - 用foreach的场景:如果你需要在循环中做更多额外操作(比如记录日志、修改元素等),foreach会更灵活。
两种方式都能完美满足你的需求,看你个人习惯和团队的代码风格就好啦!
内容的提问来源于stack exchange,提问作者Alan2
相关产品推荐
相关产品推荐

