Добавление записей в набор результатов с помощью оператора LINQ и расчета - PullRequest
0 голосов
/ 03 апреля 2020

Предположим, что я звоню в конечную точку API и получаю обратно некоторые обменные курсы в форме DataTable. Затем я отфильтрую эти обменные курсы с помощью оператора LINQ, чтобы получить только те курсы, которые меня интересуют.

LINQ для фильтрации обменных курсов:

var results = exchangeRates.Rows.Cast<DataRow>()
.Where(r => r.Field<double>("Rate") > 0)
.Where(r => r.Field<string>("FromCurrency").ToUpper() == "USD")
.Select(y => new
{
    FromCurrency = y.Field<string>("FromCurrency"),
    ToCurrency = y.Field<string>("ToCurrency"),
    ExchangeRate = y.Field<double>("Rate")
}).ToList();

Оператор LINQ возвращает:

+------------------+----------------+---------+
| OriginalCurrency | TargetCurrency |   Rate  |
+------------------+----------------+---------+
|        USD       |       GBP      |  88.452 |
+------------------+----------------+---------+
|        USD       |       CAD      | 132.819 |
+------------------+----------------+---------+

Я хотел бы добавить к результирующим записям взаимные обменные курсы. Поэтому, если у меня обменный курс доллара США по отношению к фунту стерлингов составляет 88,45, я бы хотел добавить рекорд по фунту к доллару США в размере 113,06. В общем, я поменяю местами столбцы OriginalCurrency и TargetCurrency и возьму обратную величину из первого курса, а затем умножу на 10000. У меня есть LINQ для фильтрации записей, но я не могу понять, как настроить оператор LINQ для добавления двух новых записей взаимного обменного курса.

Требуемый возврат оператора LINQ:

+------------------+----------------+--------+
| OriginalCurrency | TargetCurrency |  Rate  |
+------------------+----------------+--------+
|        USD       |       GBP      |  88.45 |
+------------------+----------------+--------+
|        USD       |       CAD      | 132.81 |
+------------------+----------------+--------+
|        GBP       |       USD      | 113.06 |
+------------------+----------------+--------+
|        CAD       |       USD      |  75.30 |
+------------------+----------------+--------+

Ответы [ 2 ]

2 голосов
/ 03 апреля 2020

Вы можете Select взаимные обменные курсы в новые перечисляемые сначала

var reciprocalResults = results
    .Select(y => new
    {
        FromCurrency = y.ToCurrency,
        ToCurrency = y.FromCurrency ,
        ExchangeRate = Math.Round (10000 / y.ExchangeRate, 2)
    });

Затем Concat оба результата в новом списке

var total = results.Concat(reciprocalResults).ToList();
1 голос
/ 03 апреля 2020

Поскольку вы хотите отобразить каждый элемент в последовательности на 2 элемента (скорость и обратное значение), вы должны использовать SelectMany.

Сначала напишите метод, который, учитывая строку в таблице , возвращает 2 строки:

// Create a class called ExchangeRate, with the three properties in your anonymous object
private static IEnumerable<ExchangeRate> RateAndReciprocal(ExchangeRate rate) {
    yield return rate;
    yield return new ExchangeRate {
        FromCurrency = rate.ToCurrency,
        ToCurrency = rate.FromCurrency,
        ExchangeRate = 10000 / rate.ExchangeRate
    };
}

Затем вызовите SelectMany в конце цепочки методов:

.Select(y => new ExchangeRate
{
    FromCurrency = y.Field<string>("FromCurrency"),
    ToCurrency = y.Field<string>("ToCurrency"),
    ExchangeRate = y.Field<double>("Rate")
})
.SelectMany(RateAndReciprocal)
.ToList();

(Конечно, вы могли бы сделать RateAndReciprocal встроенным, который спас бы вас от создания класса ExchangeRate, но мне это нравится больше)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...