การเพิ่มบันทึกลงในชุดผลลัพธ์ผ่านคำสั่ง LINQ และการคำนวณ

สมมติว่าฉันกำลังเรียกจุดสิ้นสุด 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 |
+------------------+----------------+---------+

ฉันต้องการเพิ่มอัตราแลกเปลี่ยนส่วนกลับลงในบันทึกผลลัพธ์ ดังนั้นหากฉันมีอัตราแลกเปลี่ยน USD เป็น GBP ที่ 88.45 ฉันต้องการเพิ่มบันทึกสำหรับ GBP เป็น USD ที่ 113.06 โดยพื้นฐานแล้ว ฉันจะสลับคอลัมน์ OriginalCurrency และ TargetCurrency แล้วหาส่วนกลับของอัตราแรกแล้วคูณด้วย 10,000 ฉันมี LINQ เพื่อกรองบันทึก แต่ไม่รู้วิธีปรับคำสั่ง LINQ เพื่อเพิ่มบันทึกอัตราแลกเปลี่ยนต่างตอบแทนใหม่สองรายการ

คำสั่ง LINQ ที่ต้องการส่งคืน:

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

person webworm    schedule 03.04.2020    source แหล่งที่มา


คำตอบ (2)


คุณสามารถ 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();
person Pavel Anikhouski    schedule 03.04.2020
comment
คุณแค่ results = results.Concat(results.Select(...)) - person Magnus; 03.04.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 แต่ฉันชอบสิ่งนี้มากกว่า)

person Sweeper    schedule 03.04.2020
comment
ดูเหมือนว่าคุณลืม แล้วคูณด้วย 10,000 :) - person Pavel Anikhouski; 03.04.2020
comment
@PavelAnikhouski อ๊ะ! ขอบคุณ! - person Sweeper; 03.04.2020