Получить количество записей в данных по группам - PullRequest
5 голосов
/ 07 апреля 2011

У меня есть 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 #, как мне достичь желаемых результатов?

Ответы [ 3 ]

8 голосов
/ 07 апреля 2011

Если вы можете использовать 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 голосов
/ 07 апреля 2011
  1. Создать SalesStats класс с string Name и int ClientCount = 0 членом
  2. Создать List<SalesStats>
  3. Открыть файл
  4. Читатькаждая строка и
    • Найти продавца в коллекции SalesStats OrElse добавить нового Продавца с Name
    • увеличить значение ClientCount для этого продавца
  5. Закрыть файл

Полученный список должен содержать сумму клиентов для каждого продавца

0 голосов
/ 09 февраля 2019

Старый вопрос, я знаю, но он возник, когда я искал. Я лично нашел отличные результаты с ...

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

И как примечание ... чтобы потом узнать, какое наибольшее число было ...

Int32 intDenominator = myGroupings.Values.Max();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...