LINQ - 在两个相反的标准之间获得最小数量

时间:2016-06-30 17:27:19

标签: 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库是否允许某种方式(可能使用分组或其他东西)

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以使用ToLookup或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;
}

请参阅here

对于记录,使用Count还可以指定谓词

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