Есть массив объектов типа Card {amount : decimal, currency : string} полученных из базы.
Надо на фронт отправить пользователю всё в одной валюте и для этого есть метод ApplyCurrencyRate в репозитории который к уже полученному из базы массиву применяет курс валюты выбранной пользователем.
какой вариант лучше:
List<ApplyCurrencyRate> ApplyCurrencyRate(List<ApplyCurrencyRate> list, Dictionary<string, decimal> rates)
{
var result = list;
Array.Foreach(result, ....);
return result;
}
void ApplyCurrencyRate(List<ApplyCurrencyRate> list, Dictionary<string, decimal> rates)
{
Array.Foreach(list, ....);
}
Здравствуйте, snaphold, Вы писали:
S>Есть массив объектов типа Card {amount : decimal, currency : string} полученных из базы.
S>Надо на фронт отправить пользователю всё в одной валюте и для этого есть метод ApplyCurrencyRate в репозитории который к уже полученному из базы массиву применяет курс валюты выбранной пользователем.
S>какой вариант лучше:
S>S>List<ApplyCurrencyRate> ApplyCurrencyRate(List<ApplyCurrencyRate> list, Dictionary<string, decimal> rates)
S>{
S> var result = list;
S> Array.Foreach(result, ....);
S> return result;
S>}
S>void ApplyCurrencyRate(List<ApplyCurrencyRate> list, Dictionary<string, decimal> rates)
S>{
S> Array.Foreach(list, ....);
S>}
S>
Первый вариант мутабельный, второй — имутабельный. Тебе нужно именно то, что соответствует твоей задаче. Если не хочешь менять / опасно менять / не под твоим контролем исходный лист — делай имутабельно.
ПС: имутабельно безопаснее.
Здравствуйте, snaphold, Вы писали:
S>S>List<ApplyCurrencyRate> ApplyCurrencyRate(List<ApplyCurrencyRate> list, Dictionary<string, decimal> rates)
S>{
S> var result = list;
S> Array.Foreach(result, ....);
S> return result;
S>}
S>void ApplyCurrencyRate(List<ApplyCurrencyRate> list, Dictionary<string, decimal> rates)
S>{
S> Array.Foreach(list, ....);
S>}
S>
Оба хуже. Второй изменяет переданный ему список, что может повлечь неприятные последствия при изменении потока данных — функциz ApplyCurrencyRate неявно полагается на то, что исходный список больше никому не нужен. Эту гарантию трудно обеспечить в течение всего жизненного цикла приложения.
Первый вариант — совсем плохой. Во-первых, он эквивалентен вот такому коду:
List<ApplyCurrencyRate> ApplyCurrencyRate(List<ApplyCurrencyRate> list, Dictionary<string, decimal> rates)
{
Array.Foreach(list, ....);
return list;
}
То есть делает ровно то же самое, что и второй вариант. Во-вторых, он вызвает у пользователя метода иллюзию того, что порождается
новый список, а не изменяется существующий:
var x = getCards(...);
var rates = getRates(selectedCurrency);
var y = ApplyCurrencyRate(x, rates);
// наверное, x остался неизменным, так что мы сможем выводить цену и в исходной валюте, и уже сконвертированную:
for(int i=0; i<x.Count; i++)
Console.WriteLine($"{x[i].amount} {x[i].currency} OR {y[i].amount} {selectedCurrency}");
// авотхрентам!
Безопасный способ — вот такой:
IEnumerable<decimal> ApplyCurrencyRate(IEnumerable<Card> cards, Dictionary<string, decimal> rates) => from card in cards select card.amount * rates[card.currency];
Или такой:
IEnumerable<Card> ApplyCurrencyRate(IEnumerable<Card> cards, Dictionary<string, decimal> rates, string selectedCurrency)
=> from card in cards
select card with {
amount = card.amount * rates[card.currency],
currency = selectedCurrency
}