2015-11-02 2 views
0

Je suis un débutant essayant d'apprendre à utiliser lambdas, je le class Character qui a l'intérieur d'un "List<Item> inventory" qui peut contenir "class Sword: Item" et "class Shield: Item"Utiliser Lambda pour accéder à une liste dans une liste?

Je veux obtenir un List<float> qui affiche les dégâts de chacun de mes personnages . Le damage étant le sum of damages de items dans leur inventory(swords and shields). Jusqu'ici, je sais que je peux le faire pour un personnage individuel dans ma liste de personnage et obtenir la somme des dégâts de ses objets. Mais quand j'essaye de faire tous mes personnages en même temps, cela ne fonctionne pas.

List<float> charactersTotalDamagesFromEachCharacter = characters 
      .Select(character => character.inventory) 
      .Select(item => item) 
      .Select(item => item.damage) 
      .Sum(dmg => dmg); 

Je veux obtenir un List<float> qui représentent la characters total damages(sum of damage of their items).

+3

indice: '.Select (item => item)' ne note. Cela peut être simplifié comme suit: 'characters.Select (character => character.inventory) .Sum (item => item.damage);' – Jens

+0

Commencez par réaliser que 'character' dans votre deuxième requête correspond à' characters [0] ' à partir du premier, mais pour chaque article. –

+1

Je ne peux pas recommander assez pour étudier Edulinq (http://codeblog.jonskeet.uk/category/edulinq/) pour apprendre LINQ la manière lisse. – Larry

Répondre

2

Si vous voulez connaître le total des dommages pour chaque personnage que vous devez résumer simplement les dégâts pour chaque inventaire des caractères (BTW, vous pouvez résumer directement sans sélectionner la propriété à résumer et appeler Sum() suite):

var totalDamagePerCharacter = characters.Select(c => new 
{ 
    Character = c, 
    TotalDamage = c.Inventory.Sum(item => item.Damage) 
}) 
.ToList(); 

Cependant, si vous n'avez pas besoin de connaître le personnage qui subit les dégâts et que vous souhaitez seulement avoir une liste des dégâts totaux, il suffit de projeter le personnage à son total de dégâts:

var listOfTotalDamages = characters.Select(
    c => c.Inventory.Sum(item => item.Damage)).ToList(); 
+1

Je ne vois pas pourquoi cela est mis à jour. Ni aide OP à apprendre, ni répond à sa question 'Je veux obtenir une liste de flottants qui représentent les dommages totaux de caractères (somme des dommages de leurs articles).' –

+0

@IvanStoev, j'ai corrigé ma réponse. Merci d'avoir signalé l'erreur! – RePierre

+0

Merci ça a marché !!! – CMZneu

0

Je suppose vous recherchez des dommages individuels, cela devrait vous donner le résultat correct: -

List<float> charactersTotalDamagesFromEachCharacter = characters 
              .Select(x => x.inventory.Sum(z => z.damage)) 
              .ToList(); 
+1

Merci pour la réponse! – CMZneu