Сообщение Re: Изменение массива данных от 18.12.2024 13:12
Изменено 18.12.2024 13:12 Sinclair
Re: Изменение массива данных
Здравствуйте, snaphold, Вы писали:
S>
Оба хуже. Второй изменяет переданный ему список, что может повлечь неприятные последствия при изменении потока данных — функциz ApplyCurrencyRate неявно полагается на то, что исходный список больше никому не нужен. Эту гарантию трудно обеспечить в течение всего жизненного цикла приложения.
Первый вариант — совсем плохой. Во-первых, он эквивалентен вот такому коду:
То есть делает ровно то же самое, что и второй вариант. Во-вторых, он вызвает у пользователя метода иллюзию того, что порождается новый список, а не изменяется существующий:
Безопасный способ — вот такой:
Или такой:
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>
Оба хуже. Второй изменяет переданный ему список, что может повлечь неприятные последствия при изменении потока данных — функциz ApplyCurrencyRate неявно полагается на то, что исходный список больше никому не нужен. Эту гарантию трудно обеспечить в течение всего жизненного цикла приложения.
Первый вариант — совсем плохой. Во-первых, он эквивалентен вот такому коду:
То есть делает ровно то же самое, что и второй вариант. Во-вторых, он вызвает у пользователя метода иллюзию того, что порождается новый список, а не изменяется существующий:
Безопасный способ — вот такой:
Или такой:
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
}