Информация об изменениях

Сообщение Re: Изменение массива данных от 18.12.2024 13:12

Изменено 18.12.2024 13:12 Sinclair

Re: Изменение массива данных
Здравствуйте, 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.amount} {x.currency} OR {y.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
     }
Re: Изменение массива данных
Здравствуйте, 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
     }