public async Task <IDictionary <ItemSlot.SlotHashes, Item> > ComputeMaxPower(DestinyCharacterComponent character,
                                                                                     IEnumerable <DestinyInventoryComponent> characterEquipment,
                                                                                     IEnumerable <DestinyInventoryComponent> characterInventories,
                                                                                     DestinyInventoryComponent vault,
                                                                                     IDictionary <long, DestinyItemInstanceComponent> itemInstances)
        {
            var items = await LoadItems(characterEquipment, characterInventories,
                                        vault, itemInstances);

            return(await ComputeMaxPower(character.ClassHash, items));
        }
        private Task <IEnumerable <Item> > LoadItems(IEnumerable <DestinyInventoryComponent> characterEquipment,
                                                     IEnumerable <DestinyInventoryComponent> characterInventories,
                                                     DestinyInventoryComponent vault,
                                                     IDictionary <long, DestinyItemInstanceComponent> itemInstances)
        {
            var itemComponents = characterEquipment            // Equipped items on all characters
                                 .Concat(characterInventories) // Items in all character inventories
                                 .SelectMany(group => group.Items)
                                 .Concat(vault.Items);         // Items in the Vault

            return(LoadItems(itemComponents, itemInstances));
        }
        public async Task <IDictionary <long, IDictionary <ItemSlot.SlotHashes, Item> > > ComputeMaxPower(IDictionary <long, DestinyCharacterComponent> characters,
                                                                                                          IEnumerable <DestinyInventoryComponent> characterEquipment,
                                                                                                          IEnumerable <DestinyInventoryComponent> characterInventories,
                                                                                                          DestinyInventoryComponent vault,
                                                                                                          IDictionary <long, DestinyItemInstanceComponent> itemInstances)
        {
            var items = await LoadItems(characterEquipment, characterInventories,
                                        vault, itemInstances);

            var maxPowerTasks = characters.Select(async character =>
            {
                return(character.Key, maxPower: await ComputeMaxPower(character.Value.ClassHash, items));
            });

            await Task.WhenAll(maxPowerTasks);

            return(maxPowerTasks.ToDictionary(item => item.Result.Key, item => item.Result.maxPower));
        }