Digamos que tengo esta clase amputada Person
:C#: ¿Cómo utilizar el método Enumerable.Aggregate
class Person
{
public int Age { get; set; }
public string Country { get; set; }
public int SOReputation { get; set; }
public TimeSpan TimeSpentOnSO { get; set; }
...
}
que pueda después agrupa Age
y Country
así:
var groups = aListOfPeople.GroupBy(x => new { x.Country, x.Age });
entonces puedo salida todos los grupos con su reputación total como esta:
foreach(var g in groups)
Console.WriteLine("{0}, {1}:{2}",
g.Key.Country,
g.Key.Age,
g.Sum(x => x.SOReputation));
Mi pregunta es, ¿cómo puedo obtener una suma de la propiedad TimeSpentOnSO
? El método Sum
no funcionará en este caso ya que solo es para int
y tal. Pensé que podría usar el método Aggregate
, pero realmente no puedo entender cómo usarlo ... Estoy probando todas las propiedades y tipos de clases en varias combinaciones, pero el compilador simplemente no lo reconocerá.
foreach(var g in groups)
Console.WriteLine("{0}, {1}:{2}",
g.Key.Country,
g.Key.Age,
g.Aggregate( what goes here?? ));
¿He entendido por completo el método Aggregate? ¿O qué está pasando? ¿Es algún otro método que debería usar en su lugar? ¿O tengo que escribir mi propia variante Sum
para TimeSpan
s?
Y para agregar al desastre, ¿qué pasa si la persona es una clase anónima, como resultado de, por ejemplo, una declaración Select
o GroupJoin
?
Sólo di cuenta de que podía hacer el trabajo Aggregate
método si lo hiciera un Select
en la propiedad TimeSpan
primera ... pero me parece que un poco molesto ... todavía no me siento que entiendo este método en todos los ...
foreach(var g in groups)
Console.WriteLine("{0}, {1}:{2}",
g.Key.Country,
g.Key.Age,
g.Select(x => x.TimeSpentOnSO)
g.Aggregate((sum, x) => sum + y));
Solo quiero señalar que Aggregate (reducir) es una de las cosas más geniales del mundo ahora que me he encontrado situaciones donde quería usarlo :) –