2010-08-03 5 views
15

Je voulais faire quelque chose comme ça -Comment obtenir la somme de la liste des courts métrages en utilisant la méthode d'extension Sum()?

List<short> listofshorts= new List<short>(); 
int s = listofshorts.Sum(); 
//this does not work...but same code works for a list of ints.. 

J'ai eu cette erreur de compilation -

« System.Collections.Generic.List » ne contient pas de définition de « Somme » et le meilleure surcharge de méthode d'extension « System.Linq.Queryable.Sum (System.Linq.IQueryable) » a des arguments invalides

quelqu'un peut-il suggérer comment puis-je utiliser une méthode d'extension pour calculer la somme des courts métrages? Pour une raison quelconque la méthode d'extension ne le supporte pas ...

Répondre

21
int s = listofshorts.Sum(d => d); 
+0

C'est bon. Une distribution explicite * n'est pas absolument nécessaire *, mais vous devrez fournir ce lambda simple. (La méthode 'Sum' pour' IEnumerable 'manque la surcharge sans paramètre.) –

+0

Je me demandais si cela fonctionnerait, mais je n'avais pas VS à portée de main pour le tester .... – cjk

+0

@Anthony Pegram Merci. On dirait que 'short' n'est pas * en * ces jours;) @ck C'est l'avantage d'avoir toujours VS ouvert en surfant sur SO;) –

4
// This throws an InvalidCastException in .NET 3.5 SP1+ 
// DO NOT USE THIS CODE 
listOfShorts.Cast<int>().Sum(); 

Dans l'intérêt de la postérité, et en soulignant cette solution apparemment évidente ne fonctionne pas - je vais laisser cette réponse avec les liens suivants A propos de .NET 3.5 SP1 + comportement:

+0

Je suis franchement surpris qu'il n'y ait pas de version "courte" de Sum. Parlez d'une balle droppée. Edit: oh ouais, +1. :) – Randolpho

+4

-1 parce que ceci lance une 'InvalidCastException' -' Cast() 'essaie de désemballer' 'short''' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Je crois que cela aurait fonctionné dans .NET 3.5 pre-SP1. (Oui, j'ai écrit un programme pour vérifier :) –

+0

oh bien. C'était bon en théorie! +1 à Jon pour le tester * en pratique *, m'incitant à faire de même. –

7

Vous pouvez fournir le lambda pour la méthode:

List<short> listofshorts= new List<short>(); 
int s = listofshorts.Sum(a => (int)a); 
2

Vous pouvez faire

int s = listofshorts.Aggregate((i1,i2) => i1+i2); 
+2

Je pense que vous essayez de tuer la mouche avec un marteau. Votre procédure, à mon humble avis, est une façon très compliquée de résoudre un problème simple. –

1

Comme les autres ont suggéré, vous aurez besoin de jeter les courts objets à un type qui est pris en charge par la méthode Enumerable.Sum. Malheureusement, il n'y a pas de méthode Sum surchargée pour certains types comme ulong, etc.

Si vous en avez souvent besoin, je vous recommande d'écrire une méthode d'extension, j'en ai déjà fait une pour ulong et ulong ?, vous pouvez faire quelque chose de très similaire à court ou tout autre type dont vous avez besoin:

public static ulong Sum(this IEnumerable<ulong> source) 
    { 
     var sum = 0UL; 

     foreach (var number in source) 
     { 
      sum += number; 
     } 

     return sum; 
    } 

    public static ulong? Sum(this IEnumerable<ulong?> source) 
    { 
     var sum = 0UL; 

     foreach (var nullable in source) 
     { 
      if (nullable.HasValue) 
      { 
       sum += nullable.GetValueOrDefault(); 
      }     
     } 

     return sum; 
    } 

PS mes mises en œuvre reposent sur la mise en œuvre Enumerable.Sum après avoir pris un coup d'oeil avec réflecteur pure curiosité :-P

0

Je probablement choisi l'extension .foreach(), vous ne avez pas besoin de casting ici

short sum = 0; 
myListOfShort.ForEach(val => sum += val) 
Questions connexes