【问题标题】:How to group data in a list by range by displaying the range and quantity如何通过显示范围和数量按范围对列表中的数据进行分组
【发布时间】:2019-11-26 01:51:22
【问题描述】:

我正在尝试开发一种逻辑,可以将年龄列表分组到由元组定义的范围内,预期结果如下所示:

RANGE, QUANTITY
0-4, 3
5-9, 3
10-14, 1
15-19,2

为此,我创建了以下代码:

var peoples = new[] {
    new { Id = 1, Age = 2 },
    new { Id = 2, Age = 3 },
    new { Id = 3, Age = 4 },
    new { Id = 4, Age = 6 },
    new { Id = 5, Age = 7 },
    new { Id = 6, Age = 10 },
    new { Id = 7, Age = 16 },
    new { Id = 8, Age = 7 },
    new { Id = 9, Age = 19 },
    new { Id = 10, Age = 23 },
};

var rangesAccepted = new[] { 5, 10, 15, 20, 30 };

var tuples = new List<(int, int)>
{
    (0, 4),
    (5, 9),
    (10, 14),
    (15, 19)
};

var grouped = peoples.
    GroupBy(x => rangesAccepted.FirstOrDefault(r => r >= x.Age))
    .Select(g => new 
    {
        Index = g.Key,
        Quantity = g.Count()
    })
    .OrderBy(g => g.Index)
    .ToList();

var grouped2 = new List<dynamic>();

foreach (var g in grouped)
{
    foreach (var t in tuples)
    {
        if (g.Index >= t.Item1 && t.Item2 <= g.Index)
        {
            grouped2.Add(new
            {
                Range = $"{t.Item1}-{t.Item2}",
                g.Quantity
            });
        }
    }
}

起初,我使用的是一个列表,但我使用实体框架而不是使用静态列表从数据库中获取这些结果的真正原因。我阅读了其他答案,但没有一个人说如何显示上一个示例中所示的范围。

【问题讨论】:

    标签: c# entity-framework arraylist tuples


    【解决方案1】:

    假设rangesAccepted 中没有重复项,您可以使用Array.IndexOf 查找Grouping Key 的索引。

    var result = peoples.GroupBy( x => rangesAccepted.FirstOrDefault( r => r > x.Age ) )
            .Select(x=> 
            new
            { 
                Range = Array.IndexOf(rangesAccepted,x.Key)==0?$"0-{x.Key-1}":$"{rangesAccepted[Array.IndexOf(rangesAccepted,x.Key)-1]}-{rangesAccepted[Array.IndexOf(rangesAccepted,x.Key)]-1}",
                Size = x.ToList().Count
            });
    

    输出

    【讨论】:

    • 完美。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多