Linq-To-Objects группировать по - PullRequest
1 голос
/ 26 марта 2010

Я создаю программное обеспечение для отчета по времени

У меня есть Dictionary<string, Dictionary<string, double>>. Ключ в основном словаре - это имя пользователя, а его значение - это словарь.

У меня есть функция GetDepartment (строка UserName), которая возвращает строку с отделом пользователей.

Я хочу создать новый словарь того же типа, в котором основным ключом будет отдел, а в поддиректории a - общее количество часов для этого отдела.

Я пытался сделать это с помощью linq, но безуспешно. Был бы очень рад за помощь здесь!

РЕДАКТИРОВАТЬ: Этот код делает именно то, что я хочу. Но я хочу это в LINQ

        Dictionary<string, Dictionary<string, double>> temphours = new Dictionary<string, Dictionary<string, double>>(); ;
        foreach (var user in hours)
        {
            string department = GetDepartment(user.Key);
            if (!temphours.ContainsKey(department))
            {
                temphours.Add(department, new Dictionary<string, double>());
            }
            foreach (var customerReport in user.Value)
            {
                if (!temphours[department].ContainsKey(customerReport.Key))
                {
                    temphours[department].Add(customerReport.Key, 0);
                }
                temphours[department][customerReport.Key] += customerReport.Value;
            }
        }

Ответы [ 2 ]

2 голосов
/ 26 марта 2010

Почему вы хотите сделать это с LINQ? Я не думаю, что это будет более понятным, плюс запросы LINQ не так легко отлаживать.

Следующее выражение не будет работать в LINQ to Entities, поскольку вы не можете вызвать там функцию C #, например, GetDepartment.

Dictionary<string, Dictionary<string, double>> temphours 
    = (from user in hours
       group user by GetDepartment(user.Key) into department
       select new {
          Key = department.Key
          Value = (from userInDepartment in department
                   from report in userInDepartment.Value
                   group report by report.Key into g // To tired to think of a name =)
                   select new {
                       Key = g.Key
                       Value = g.Sum(reportInG => reportInG.Value)
                   }).ToDictonary(ud => ud.Key, ud=> ud.Value);
       }).ToDictonary(u => u.Key, u=> u.Value);

Я не уверен, что это без ошибок. По крайней мере, это должно дать вам представление о том, как это сделать.

1 голос
/ 26 марта 2010

Вот мое мнение.

Dictionary<string, Dictionary<string, double>> temphours =
(
  from user in hours
  let department = GetDepartment(user.Key)
  from customerReport in user.Value
  group customerReport by department
)
.ToDictionary(
  g => g.Key,
  g => g.GroupBy(rep => rep.Key).ToDictionary
  (
    g2 => g2.Key,
    g2 => g2.Sum(rep => rep.Value)
  )
);

Это прямое, как я могу это сделать. Если вы хотите немного большей информативности, то это может сделать это для вас:

Dictionary<string, Dictionary<string, double>> temphours =
(
  from user in hours
  let department = GetDepartment(user.Key)
  from customerReport in user.Value
  group customerReport by department into reportGroup
  select new
  {
    Department = reportGroup.Key,
    Reports =
    (
       from report in reportGroup
       group report.Value by report.Key
    ).ToDictionary(g => g.Key, g => g.Sum())
  }
)
.ToDictionary{
  x => x.Department,
  x => x.Reports
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...