You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:35:17