【问题标题】:Using LINQ to count value frequency使用 LINQ 计算值频率
【发布时间】:2010-09-05 23:27:17
【问题描述】:

我有一张桌子

ID|VALUE

VALUE 是一个整数字段,可能取值在 0 到 4 之间。如何查询每个值的计数?

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

【问题讨论】:

    标签: c# sql linq linq-to-sql


    【解决方案1】:

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

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

    输出:

    Value = 0, Count = 2
    Value = 1, Count = 2
    Value = 2, Count = 2
    Value = 3, Count = 2
    Value = 4, Count = 2
    

    稍作修改的版本返回一个仅包含值计数的数组:

    int[] valuesCounted  = (from r in records
                            group r by r.Value
                            into g
                            select g.Count()).ToArray();
    

    最后添加行数:

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

    【讨论】:

      【解决方案2】:

      以下是获取VALUE 的每个值的行数的方法,按顺序排列:

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

      【讨论】:

      • 或者我可以添加所有计数吗?我可以使用 counts.Sum() 吗?
      • 是的,您也可以这样做。我已经编辑了我的答案以反映它。
      猜你喜欢
      • 1970-01-01
      • 2014-03-18
      • 1970-01-01
      • 2015-11-20
      • 1970-01-01
      • 2015-03-05
      • 1970-01-01
      • 2019-10-20
      • 2021-10-15
      相关资源
      最近更新 更多