Как насчет:
Map<DateTime, List<Client>> clientsByRegsitrationDate(Iterable<Client> clients) {
var result = <DateTime, List<Client>>{};
for (var client in clients) {
for (var registration in client.registrations) {
result.putIfAbsent(registration.date, () => []).add(client);
}
}
return result;
}
Это предполагает, что все даты регистрации для одного и того же клиента разные, иначе один и тот же клиент может оказаться в списке более одного раза. Если вы хотите избежать этого, возможно:
Map<DateTime, List<Client>> clientsByRegsitrationDate(Iterable<Client> clients) {
var result = <DateTime, List<Client>>{};
for (var client in clients) {
for (var registration in client.registrations) {
var list = result.putIfAbsent(registration.date, () => []);
if (list.isEmpty || !identical(list.last, client)) list.add(client);
}
}
return result;
}
Или просто используйте наборы вместо списков для сбора клиентов:
Map<DateTime, Set<Client>> clientsByRegsitrationDate(Iterable<Client> clients) {
var result = <DateTime, List<Client>>{};
for (var client in clients) {
for (var registration in client.registrations) {
result.putIfAbsent(registration.date, () => {}).add(client);
}
}
return result;
}
Это также позволяет избежать двойного подсчета клиентов, если они встречаются больше чем один раз в clients
.