На этот вопрос уже был получен ответ, но другие ответы по-прежнему будут выполнять несколько итераций по коллекции (несколько вызовов Sum) или создавать множество промежуточных объектов / кортежей, которые могут быть хорошими, но если это не так, то вы можетесоздайте метод расширения (или несколько), который делает это старомодным способом, но хорошо вписывается в выражение LINQ.
Такой метод расширения будет выглядеть следующим образом:
public static Tuple<int, int> Sum<T>(this IEnumerable<T> collection, Func<T, int> selector1, Func<T, int> selector2)
{
int a = 0;
int b = 0;
foreach(var i in collection)
{
a += selector1(i);
b += selector2(i);
}
return Tuple.Create(a, b);
}
И выможно использовать это так:
public class Stuff
{
public int X;
public int Y;
}
//...
var stuffs = new List<Stuff>()
{
new Stuff { X = 1, Y = 10 },
new Stuff { X = 1, Y = 10 }
};
var sums = stuffs.Sum(s => s.X, s => s.Y);