Изменение массива данных
От: snaphold  
Дата: 17.12.24 06:52
Оценка:
Есть массив объектов типа 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, ....);
}
Re: Изменение массива данных
От: Doom100500 Израиль  
Дата: 17.12.24 07:57
Оценка:
Здравствуйте, 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>


Первый вариант мутабельный, второй — имутабельный. Тебе нужно именно то, что соответствует твоей задаче. Если не хочешь менять / опасно менять / не под твоим контролем исходный лист — делай имутабельно.

ПС: имутабельно безопаснее.
Спасибо за внимание
Отредактировано 17.12.2024 7:58 Doom100500 . Предыдущая версия . Еще …
Отредактировано 17.12.2024 7:58 Doom100500 . Предыдущая версия .
Re: Изменение массива данных
От: Sinclair Россия https://github.com/evilguest/
Дата: 18.12.24 13:12
Оценка: 3 (1) +2
Здравствуйте, 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
     }
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Отредактировано 22.12.2024 15:42 Sinclair . Предыдущая версия . Еще …
Отредактировано 18.12.2024 13:12 Sinclair . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.