2011-09-18 15 views
6

tengo este códigoCómo combinar dos operaciones de suma en una usando LINQ?

Dim sum As Integer = scores.Sum(Function(score) score.Fraction * score.Score) 
Dim count As Integer = scores.Sum(Function(score) score.Fraction) 

o en C#:

var sum=scores.Sum(score=>score.Fraction * score.Score); 
var count=scores.Sum(score=>score.Fraction); 

Cómo puedo combinar estos y lograr que la colección sólo se enumera una vez? Encontré algunos ejemplos, pero si no me equivoco, todavía iteran la colección dos veces.

Respuesta

11
var sum = 0; 
var count = 0; 

foreach(var score in scores){ 
    sum += score.Fraction * score.Score; 
    count += score.Fraction; 
} 

... Mi punto es, ¿por qué utilizar LINQ en absoluto - que está destinado a hacer ciertas cosas más fáciles, pero esto no es más fácil con LINQ.

+0

Creo que la gracia tiene que ceder el paso a la legibilidad aquí ;-) – Dabblernl

10

Puede hacerlo con Aggregate, aunque es un poco de dolor - y crea un objeto extra por cada iteración:

var sums = scores.Aggregate(new { Sum = 0, Count = 0 }, 
    (current, item) => new { Sum = current.Sum + item.Score * item.Fraction, 
           Count = current.Count + item.Fraction }); 

Obviamente se podría hacer esto más eficiente mediante la creación de una estructura ValueTuple<T1, T2> - tupla como , pero como una estructura

EDITAR: Estoy de acuerdo con el punto de Petar: si esto es todo lo que necesita hacer, entonces LINQ no es realmente útil en esta situación.

Cuestiones relacionadas