LINQ -获得2个对立标准之间的最小计数
本文关键字:之间 标准 获得 2个 对立 LINQ | 更新日期: 2023-09-27 17:53:25
我不知道如何表达这个问题的标题,但假设我在c#程序中定义了以下2个变量:
var maxVal = 8;
var myList = new List<int> { 1, 4, 6, 7, 1, 2, 6, 3, 8};
假设我想求
之间的最小值a) The number of elements with values < maxVal / 2
b) The number of elements with values >= maxVal / 2
因此,给定上面的示例值,我们将有:
a) {1,1,2,3} => count = 4
b) {4,6,7,6,8} => count = 5
所以我想要4的值
我能想到的方法是:
var output = Math.Min(
myList.Where(v => v < maxVal / 2).Count(),
myList.Where(v => v >= maxVal / 2).Count()
);
但是我很想知道Linq库是否允许一种方法(可能使用分组或其他)
谢谢! !
你可以使用tollookup或GroupBy
myList.ToLookup(v => v < maxVal / 2).Min(grp => grp.Count())
myList.GroupBy(v => v < maxVal / 2).Min(grp => grp.Count())
这里假设只有两个可能的组
- 值小于最大值的一半
- 所有其他(等于或大于等于)
如果你有两个以上的组,你需要创建一个更复杂的函数来选择分组的键
myList.GroupBy(v => _getKey(v, maxValue)).Min(grp => grp.Count())
...
private int _getKey(int value, int maxValue )
{
if(value < maxValue / 4) return 0;
if(value < maxValue / 2) return 1;
if(value < maxValue / 4 * 3) return 2;
return 3;
}
看到
对于记录,您还可以使用Count指定谓词
myList.Count(v => v < maxVal / 2),