按分组获取数据表中记录的数量

5

我有一个包含以下数据的 DataTable:

Salesman---ClientID
Bob--------1
Bob--------2
Bob--------3
Tom--------4
Joe--------5
Joe--------6
Tim--------7
Tim--------8

我希望能够统计每个销售员拥有多少客户。在这种情况下:

Salesman---CountOfClients
Bob--------3
Tom--------1
Joe--------2
Tim--------2

该程序正在读取包含此数据的文本文件,不与数据库连接,因此SQL不是一个选项。

使用C#,我如何实现所需的结果?


请问你能贴出你的代码吗?你可以考虑使用 DataTable。 - WorldIsRound
3个回答

12
如果您会使用LINQ,那么groupby子句将为您执行聚合操作。
// this is your datatable
DataTable table = new DataTable();
table.Columns.Add("Salesman", typeof(string));
table.Columns.Add("ClientID", typeof(int));

//insert your data
table.Rows.Add("Bob", 1);
table.Rows.Add("Bob", 2);
table.Rows.Add("Bob", 3);
table.Rows.Add("Tom", 4);
table.Rows.Add("Joe", 5);
table.Rows.Add("Joe", 6);
table.Rows.Add("Tim", 7);
table.Rows.Add("Tim", 8);

// query with LINQ 
var query = from row in table.AsEnumerable()
            group row by row.Field<string>("Salesman") into sales
            orderby sales.Key
            select new
            {
                Name = sales.Key,
                CountOfClients = sales.Count()
            };

// print result
foreach (var salesman in query)
{
    Console.WriteLine("{0}\t{1}", salesman.Name, salesman.CountOfClients);
}

输出:

Bob    3
Joe    2
Tim    2
Tom    1

2
  1. 创建一个SalesStats类,包含一个string Name和一个int ClientCount = 0成员。
  2. 创建一个List<SalesStats>
  3. 打开文件。
  4. 逐行读取文件,并执行以下操作:
    • SalesStats集合中找到销售员,否则添加一个新的销售员并设置其Name属性。
    • 增加该销售员的ClientCount属性。
  5. 关闭文件。

最终的列表应该包含每个销售员的客户总数。


1

虽然这是一个老问题,但当我在查找时它又出现了。个人经验表明,...

Dictionary<object, Int32> myGroupings = myDataTable.AsEnumerable().GroupBy(p => p.Field<object>("FieldName")).ToDictionary(p => p.Key, p => p.Count());

作为一个附注,要找出最大的计数数字...
Int32 intDenominator = myGroupings.Values.Max();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接