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

如何用LINQ的Min()方法获取窗体上6个ListBox中项数最少的?

用LINQ找出项数最少的ListBox

嘿,我来帮你搞定这个问题!你想用LINQ的Min()相关方法来优雅地找出窗体中项数最少的ListBox,对吧?原来的foreach循环思路是对的,但可能因为初始化问题没达到预期,而且确实可以用LINQ简化得更简洁。

方法一:用.NET 6+的MinBy()(推荐)

如果你用的是.NET 6或更高版本,MinBy()扩展方法简直是为这个场景量身定做的——它直接根据你指定的键(这里就是Items.Count)返回对应的最小元素:

// 直接获取项数最少的ListBox
var smallestListBox = Controls.OfType<ListBox>()
    .MinBy(listBox => listBox.Items.Count);

这个方法一步到位,代码非常干净。如果有多个ListBox项数相同且都是最少的,它会返回第一个遇到的那个。

方法二:兼容旧版本.NET(用Min()+First())

如果你的项目用的是更早的.NET版本(比如.NET Framework),没有MinBy(),可以分两步走:先找出最小的项数,再找到对应的ListBox:

// 第一步:获取所有ListBox中最小的项数
int minItemCount = Controls.OfType<ListBox>()
    .Min(listBox => listBox.Items.Count);

// 第二步:找到第一个项数等于最小值的ListBox
var smallestListBox = Controls.OfType<ListBox>()
    .First(listBox => listBox.Items.Count == minItemCount);

修复你原来的foreach代码

你的foreach思路没问题,但大概率是min的初始化不对导致结果不符合预期。应该把min初始化为int.MaxValue(而不是0),这样第一个ListBox的项数肯定会小于初始值,从而被选中:

ListBox targetListBox = null;
int minCount = int.MaxValue; // 关键:初始化为最大值

foreach (var listBox in Controls.OfType<ListBox>())
{
    // 如果当前ListBox项数更小,就更新目标和最小值
    if (listBox.Items.Count < minCount)
    {
        targetListBox = listBox;
        minCount = listBox.Items.Count;
    }
    // 如果想用<=,会在遇到相同项数的ListBox时更新为最后一个
}

注意事项

  • 如果窗体中没有ListBox,上面的方法都会返回null,所以最好先判断是否存在ListBox:
    var allListBoxes = Controls.OfType<ListBox>().ToList();
    if (allListBoxes.Any())
    {
        var smallest = allListBoxes.MinBy(lb => lb.Items.Count);
        // 这里处理找到的ListBox
    }
    else
    {
        // 处理没有ListBox的情况,比如提示用户
    }
    
  • 如果有多个ListBox项数相同且都是最少的,MinBy()和First()会返回第一个,而用<=的foreach会返回最后一个,根据你的需求选择即可。

内容的提问来源于stack exchange,提问作者Kenneth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:44:52