C# 使用LINQ对数值频率进行计数

C# 使用LINQ对数值频率进行计数,c#,sql,linq,linq-to-sql,C#,Sql,Linq,Linq To Sql,我有一张桌子 ID|VALUE 值是一个整数字段,可能值介于0和4之间。如何查询每个值的计数 理想情况下,结果应该是一个包含6个元素的数组,一个用于每个值的计数,最后一个用于总行数。以下是如何获得值的每个值的行数,顺序如下: var counts = from row in db.Table group row by row.VALUE into rowsByValue orderby rowsByValue.Key select rowsByValue.Cou

我有一张桌子

ID|VALUE
值是一个整数字段,可能值介于0和4之间。如何查询每个值的计数


理想情况下,结果应该是一个包含6个元素的数组,一个用于每个值的计数,最后一个用于总行数。

以下是如何获得
值的每个值的行数,顺序如下:

var counts =
    from row in db.Table
    group row by row.VALUE into rowsByValue
    orderby rowsByValue.Key
    select rowsByValue.Count();
要获得表中的总行数,可以将所有计数相加。但是,您不希望原始序列重复两次;这将导致查询执行两次。相反,您应该首先创建一个中间列表:

var countsList = counts.ToList();   

var countsWithTotal = countsList.Concat(new[] { countsList.Sum() });

这个简单的程序就是这样做的:

class Record
{
    public int Id { get; set; }
    public int Value { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        List<Record> records = new List<Record>()
        {
            new Record() { Id = 1,  Value = 0},
            new Record() { Id = 2,  Value = 1 },
            new Record() { Id = 3,  Value = 2 },
            new Record() { Id = 4,  Value = 3 },
            new Record() { Id = 5,  Value = 4 },
            new Record() { Id = 6,  Value = 2 },
            new Record() { Id = 7,  Value = 3 },
            new Record() { Id = 8,  Value = 1 },
            new Record() { Id = 9,  Value = 0 },
            new Record() { Id = 10, Value = 4 }
        };

        var query = from r in records
                    group r by r.Value into g
                    select new {Count = g.Count(), Value = g.Key};

        foreach (var v in query)
        {
            Console.WriteLine("Value = {0}, Count = {1}", v.Value, v.Count);
        }
    }
}
稍微修改版本以返回仅包含值计数的数组:

int[] valuesCounted  = (from r in records
                        group r by r.Value
                        into g
                        select g.Count()).ToArray();
最后添加行数:

valuesCounted = valuesCounted.Concat(new[] { records.Count()}).ToArray();

或者我可以把所有的计数加起来吗?我可以使用counts.Sum()吗?是的,你也可以这样做。我编辑了我的答案以反映它。
valuesCounted = valuesCounted.Concat(new[] { records.Count()}).ToArray();