如何用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
相关产品推荐
相关产品推荐

