2009-12-03 3 views
0

Cette question a été posée à interview.I besoin d'avoir au total en cours d'exécution (uniquement à l'aide d'agrégat())C# - Total courant à partir de granulats()

du tableau

(ie)

int[] array={10,20,30}; 

Expected output 

10 
30 
60 

quand j'utilise des agrégats (j'ai appliqué une logique pire)

array.Aggregate((a, b) => { Console.WriteLine(a + b); return (a + b); }); 

1) It prints 30,60, pour moi il n'y a pas d'utilisation de retour (a + b).

2) Afin d'imprimer 10, je dois modifier le tableau en ajoutant l'élément zéro (c'est-à-dire {0,10,20,30}).

Y a-t-il un travail soigné qui pourrait l'éteindre?

+3

Quiconque vous a demandé de le faire n'utilise pas de bonnes pratiques de codage pour les opérateurs de séquence. "Aggregate" devrait retourner une valeur scalaire, et c'est tout ce qu'il devrait faire; il ne devrait pas produire d'effet secondaire en cours de route. Si ce que vous voulez produire est "séquence de totaux cumulés cumulés", n'utilisez pas Aggregate; écrire un nouvel opérateur de séquence "Accumuler" et l'utiliser. –

Répondre

5

essayer :-) array.Aggregate(0, (a, b) => { Console.WriteLine(a + b); return (a + b); }); à la place

2

Aggregate a d'autres qui fonctionnent légèrement surcharges différemment - jeter un oeil à celui-ci: http://msdn.microsoft.com/en-us/library/bb549218.aspx:

public static TAccumulate Aggregate<TSource, TAccumulate>(
    this IEnumerable<TSource> source, 
    TAccumulate seed, 
    Func<TAccumulate, TSource, TAccumulate> func) 
1

Vous devez spécifier la semence valeur 0:

int[] array = { 10, 20, 30 }; 
array.Aggregate(0, (a, b) => { Console.WriteLine(a + b); return a + b; }); 

Ceci affichera ce que vous attendez.

1
array.Aggregate(0, (a, b) => 
{ 
    Console.WriteLine(a + b); 
    return a + b; 
}); 
1
array.Aggregate(0, (progress, next) => { Console.WriteLine(progress + next); return (progress + next); }); 

utiliser la version de granulats qui commence à l'agrégation avec une valeur de départ, plutôt que commence l'agrégation avec la première paire.