c# - LINQ - 获取 2 个相反条件之间的最小计数

标签 c# linq

我不知道如何表达这个问题的标题,但假设我在 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 库是否允许某种方式(也许使用分组或其他方式)

谢谢!!

最佳答案

你可以使用 ToLookup 或 GroupBy 使其工作

myList.ToLookup(v => v < maxVal / 2).Min(grp => grp.Count())
myList.GroupBy(v => v < maxVal / 2).Min(grp => grp.Count())

这假设只有两个可能的组

  • 值小于最大值的一半
  • 所有其他(等于或大于)

如果您有 2 个以上的组,则需要创建一个更复杂的函数来选择分组键

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;
}

参见here

郑重声明,使用 Count 您还可以指定谓词

  myList.Count(v => v < maxVal / 2),

关于c# - LINQ - 获取 2 个相反条件之间的最小计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38129737/

相关文章:

c# - 如何在gridview的页脚绑定(bind)数据

c# - 如何使用 LINQ 查询在 Select with F# 中包含索引

linq - 编译需要参数的表达式

c# - 如果任何列值为空,则删除数据表行c#

.net - SQL Azure 使用哪种 ORM?

c# - 如何在 UML 中正式记录 C# 属性?

c# - 绑定(bind)带参数的点击函数

c# - 获取图像的特定部分(图片)

c# - 无法使用代码优先创建数据库

c# - 合并可能为空的 LINQ 查询结果