2010-08-03 8 views
15

yo estaba tratando de hacer algo como esto -¿Cómo obtener la suma de la lista de cortos usando el método de extensión Sum()?

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

Tengo este error de compilación -

'System.Collections.Generic.List' no contiene una definición de 'suma' y la mejor extensión de sobrecarga del método 'System.Linq.Queryable.Sum (System.Linq.IQueryable)' tiene algunos argumentos no válidos

¿puede alguien sugerir cómo puedo usar un método de extensión para calcular la suma de pantalones cortos? Por alguna razón, el método de extensión no lo soporta ...

Respuesta

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

Esto es bueno. Un lanzamiento explícito * no es absolutamente necesario *, pero necesitarías proporcionar este simple lambda. (El método 'Suma' para 'IEnumerable 'no tiene la sobrecarga sin parámetros.) –

+0

Me pregunté si esto funcionaría, pero no tenía VS práctico para probarlo .... – cjk

+0

@Anthony Pegram Gracias. Parece que 'corto' no está * en * en estos días;) @ck Esa es la ventaja de tener VS abierto siempre mientras se navega en SO;) –

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

En aras de la posteridad, y señalando esta solución aparentemente obvia no funciona - Voy a dejar esta respuesta con los siguientes enlaces sobre .NET 3.5 SP1 + comportamiento:

+0

Estoy francamente sorprendido de que no haya una versión "corta" de Sum. Hablando de una pelota dropeada. Editar: oh sí, +1. :) – Randolpho

+4

-1 porque esto arroja una 'InvalidCastException' -' Cast() 'intenta deshacer la caja de un 'short' en caja 'a' int', que falla. Creo que hubiera funcionado en .NET 3.5 pre-SP1. (Sí, escribí un programa para verificar :) –

+0

oh bien. ¡Fue bueno en teoría! +1 a Jon por probarlo * en la práctica *, lo que me llevó a hacer lo mismo. –

7

le puede proporcionar la lambda para el método:

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

que podría hacer

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

Creo que estás tratando de matar la mosca con un mazo. Su procedimiento, en mi humilde opinión, es una forma súper complicada de resolver un problema simple. –

1

Al igual que los otros han sugerido, que tendrá que emitir los objetos cortos a un tipo que es compatible con el método Enumerable.Sum. Desafortunadamente no hay un método de suma sobrecargado para algunos de los tipos como ulong, etc.

Si vas a necesitarlo muy seguido, te recomiendo que escribas un método de extensión, aquí hay uno que hice hace un tiempo para ulong y ulong ?, puede hacer algo muy similar para abreviar o cualquier otro tipo que necesite:

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 mis implementaciones se basan en la aplicación Enumerable.Sum después de que tomara un vistazo con reflector puramente por curiosidad :-P

0

que probablemente eligió la extensión .ForEach(), que no es necesario ningún colado aquí

short sum = 0; 
myListOfShort.ForEach(val => sum += val) 
Cuestiones relacionadas