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();