[c#]分组的帮助下一个 bin 数组数组的元素

标签: Linq C#
发布时间: 2017/2/28 23:00:37
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

假定我们有一个数组︰

int[] values = new int[10];
values[0] = 1;
values[1] = 2;
values[2] = 3;
values[3] = 4;
values[4] = 6;
values[5] = 8;
values[6] = 2;
values[7] = 1;
values[8] = 3;
values[9] = 9;

我还有另一个数组,比如说 def 数组定义存储桶︰

int[] def= new int[3]; // defs holds the definition of the buckets
def[0] = 0;
def[1] = 5;
def2] = 10;

我想要使用此 def 阵列进行分组的值的数组,为了得到准确的频率分布,使用 c#:

bin[0] = 7; // the number of array values that lies between 0 and 5
bin[1] = 3; // the number of array values that lies between 5 and 10

已经找到了一种解决方案,循环,但我确信还有更优雅,更简洁的方式来执行此操作;linq / 组的方法。

我如何可以代码使用 LINQ 的 Group By 这个程序?

提前感谢任何答案,作出贡献

Aykut

解决方法 1:

试试这个︰

var bin =
    array
        .GroupBy(x => x / 5)
        .Select(x => x.Count())
        .ToArray();

或更好的是这︰

var lookup = array.ToLookup(x => x / 5);
var bin =
    Enumerable
        .Range(0, lookup.Max(x => x.Key) + 1)
        .Select(x => lookup[x].Count())
        .ToArray();

这第二个示例工作如果原始数组中有一些边远的数字。

甚至更好,使用 buckets :

var buckets = new [] { 0, 5, 10, };
var lookup = array.ToLookup(x => buckets.Where(b => x >= b).Count() - 1);
var bin =
    Enumerable
        .Range(0, lookup.Max(x => x.Key) + 1)
        .Select(x => lookup[x].Count())
        .ToArray();
赞助商