2015-05-20 2 views
0

Я делаю некоторые C# -кодирование, где у меня есть несколько объектов одного типа. Например:Добавление нескольких объектов одного типа в один

public class Expense 
{ 
    public decimal Food{ get; set; } 
    public decimal Clothing{ get; set; } 
    public decimal Medical{ get; set; } 
} 

Теперь мы имеем Expense из 3 людей X, Y и Z. Я хочу, чтобы создать объект «Total» того же типа (Expense), который будет сложить все это вместе.

Есть ли ярлык, чтобы сделать это, а не добавлять все отдельно?

+0

Нет, нет ярлыка. – Blorgbeard

+0

Когда вы говорите, добавьте «все отдельно», вы имеете в виду каждое свойство или каждый объект? –

+0

Не без использования отражения. Создайте метод Expense, который возвращает общее количество всех расходов и использует это как-то вроде ... people.Sum (p => p.Expense.TotalExpenses()); –

ответ

2

Если у вас есть все объекты в List<> (или другие IEnumerable), вы можете использовать Linq. Например, если ваш список выглядит так:

var X = new Expense { Food = 1, Clothing = 2, Medical = 3 }; 
var Y = new Expense { Food = 1, Clothing = 2, Medical = 3 }; 
var Z = new Expense { Food = 1, Clothing = 2, Medical = 3 }; 

var expenses = new List<Expense> { X, Y, Z }; 

Вы можете создать «общие» расходы объект с помощью метода IEnumerable.Sum() так:

var totalExpenses = new Expense 
{ 
    Food = expenses.Sum(e => e.Food), 
    Clothing = expenses.Sum(e => e.Clothing), 
    Medical = expenses.Sum(e => e.Medical) 
}; 
+0

Это звучит аккуратно ... – Jay

0

Что вам нужно, это производное свойство

public class Expense 
{ 
    public decimal Food{ get; set; } 
    public decimal Clothing{ get; set; } 
    public decimal Medical{ get; set; } 
    public decimal TotalExpense { get { return Food+Clothing+Medical; } } 
} 

, а затем сложить все расходы

List<Expense> expenses = ... 
decimal total = expenses.Sum((x)=>x.TotalExpense); 
+0

Почему новое свойство вместо просто 'costs.Sum ((x) => x.Food + x.Clothing + x.Medical)'? – DavidG

+0

Поскольку у вас есть логическая единица для 'Expense', поэтому с принципами ООП позволяет объекту обрабатывать свои собственные данные. Для меня просто разумно, чтобы каждый расход был рассчитан локально. В будущем, если изменения расходов вам не нужно будет искать на всем протяжении кода, чтобы исправить это. Ведение вычисления на местном уровне означает, что в наиболее очевидном месте потребуется одно изменение - свойство «TotalExpense». – ja72

Смежные вопросы