在IEnumerable中按计数对元素进行分组

时间:2012-03-06 15:20:15

标签: .net group-by ienumerable

我们如何通过给定列的值获取行数?

  • 我正在从存储过程返回的数据表中创建IEnumerable

        DataSet ds = new DataSet();
        // code to get table using sp    
        IEnumerable<DataRow> Myrows = ds.Tables[0].AsEnumerable();
    
  • 我的表返回类似

    的数据
       Id | Column1 | Column2 | Column3 |
        1 | xCol1   | xCol2   | xCol3   |
        2 | xCol1   | xyy     | ser     |
        3 | xCol2   | 2324    | ser     |
    
  • 现在我想通过Column1获取group的行数。所以我的结果应该是

        Count | Column |
          2   | xCol1  |
          1   | xCol2  |
    

2 个答案:

答案 0 :(得分:0)

有几种方法可以做到这一点:

  1. 迭代IEnumerable集合并计算元素。
  2. 如果您不想进行迭代,请使用Myrows.ToList().Count,这将创建IEnumerable集合中的列表,并获取列表的Count属性。
  3. 您可以使用linq来执行分组并从那里获取计数。这是一个例子:

    var groups =
      from row in rows
      group rows by row.Column;
    
    foreach (var group in groups)
      Console.WriteLine("key: {0} count: {1}",
        group.Key, group.Count());
    

    另请参阅此问题以获取更多信息:Howto: Count the items from a IEnumerable without iterating?

答案 1 :(得分:0)

    DataSet ds = new DataSet();
    // code to get table using sp    
    var grouped = ds.Tables[0].AsEnumerable().GroupBy(q=>q.Table.Columns["column1"]).Select(q=> new{Count = q.Count(), Column = q});

我没试过。但是那样的事情。