0

2 つの異なるファイルを 1 つのファイルに結合し、一致する seqNum からのデータを比較し、それらに対して小さな数式を実行するコードをいくつか書きました。私が抱えている問題は、数学の部分から得た答えとともに、各 seqNum を使用して他のすべての一致データを出力することです。LINQ を使用して 2 つの異なる seqNum 配列を照合し、while ループを記述してすべてのデータを出力しました。変数 "item" (数学方程式からの答え) に int 値を入れるたびに、範囲外例外が発生しますが、"item" に int 値を入れないと、ループして同じ答えを出力します配列にあるすべてのアイテムに対して、次の回答に進み、同じことを行います。これがコードです...

    private void executeBtn_Click(object sender, EventArgs e)
    {

        //NET OIL VARIANCE MATHEMATICS
        if (netOilRadBtn.Checked)
        {
            using (var sw = new StreamWriter("testNetOil.csv"))
            {
                var items = netOil.Zip(seqNum, (oil, seq) => new { Oil = oil, Seq = seq });
                var items2 = netOil2.Zip(seqNum2, (oil, seq) => new { Oil = oil, Seq = seq });
                sw.WriteLine("Lease Name, Field Name, Reservoir, Operator, County, ST, Majo, Resv Cat, Discount Rate, Net Oil Interest, Net Gas Interest, Working Interest, Gross Wells, Ultimate Oil, Ultimate Gas, Gross Oil, Gross NGL, Gross Gas, Net Oil, Net Gas, Net NGL, Revenue To Int., Oper. Expense, Total Invest., Revenue Oil, Revenue Gas, Operating Profit, Revenue NGL, Disc Net Income, SEQ, Well ID, INC ASN, Life Years, Own Qual, Production Tax, NET OIL VARIANCE");

                foreach (var item in items.Join(items2, i => i.Seq, i => i.Seq, (a, b) =>
                {
                    double first = Convert.ToDouble(a.Oil);
                    double second = Convert.ToDouble(b.Oil);
                    double answer = (first - second) / second;
                    return string.Format("{0}, {1}", a.Seq, answer);
                }))
                {                        
                    int x = listHead;
                    while (x != -1)
                    {
                        sw.WriteLine("{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}, {11}, {12}, {13}, {14}, {15}, {16}, {17}, {18}, {19}, {20}, {21}, {22}, {23}, {24}, {25}, {26}, {27}, {28}, {29}, {30}, {31}, {32}, {33}, {34}, {35}",
                QuoteString(leaseName[x]), fieldName[x], QuoteString2(reservoir[x]), operator1[x], county[x], state[x], majo[x], resvCatgory[x], disRate[x], netOil2Int[x], netGas2Int[x], workingInt[x], grossWells[x]
                , ultOil[x], ultGas[x], grossOil[x], grossNGL[x], grossGas[x], netOil[x], netGas[x], netNGL[x], revToInt[x], operExpense[x], totInvest[x], revOil[x], revGas[x], operatingProfit[x],
                revNGL[x], discNetIncome[x], seqNum[x], wellID[x], incASN[x], lifeYears[x], ownQual[x], prodTax[x], item[x]);
                x = pointers[x];

                        //sw.WriteLine(item);
                    }
                    sw.Close();
                }
            }
        }

誰かがこの問題を手伝ってくれて、他のすべての一致するデータ配列と一緒に正しい seqNum に答えを出力できるかどうか疑問に思っていました。ありがとう。

4

1 に答える 1

0

OK、最初に、計算ロジックをメソッドに移動して、これを少し明確にしたので、これを追加する必要があります。

private double GetTheAnswer(double first, double second)
{
    double answer = (first - second) / second;
    return answer;
}

次に、LINQ ステートメントを変更し、関心のあるビットを匿名オブジェクトに選択しました。その後、出力書き込みステートメントの最後にもう 1 つのフィールドを追加し、匿名型に対して定義したプロパティにアクセスしました。また、アイテムに対する配列インデックス '[x]' を削除しました。

        using (var sw = new StreamWriter("testNetOil.csv"))
        {
            var items = netOil.Zip(seqNum, (oil, seq) => new { Oil = oil, Seq = seq });
            var items2 = netOil2.Zip(seqNum2, (oil, seq) => new { Oil = oil, Seq = seq });
            sw.WriteLine("Lease Name, Field Name, Reservoir, Operator, County, ST, Majo, Resv Cat, Discount Rate, Net Oil Interest, Net Gas Interest, Working Interest, Gross Wells, Ultimate Oil, Ultimate Gas, Gross Oil, Gross NGL, Gross Gas, Net Oil, Net Gas, Net NGL, Revenue To Int., Oper. Expense, Total Invest., Revenue Oil, Revenue Gas, Operating Profit, Revenue NGL, Disc Net Income, SEQ, Well ID, INC ASN, Life Years, Own Qual, Production Tax, NET OIL VARIANCE");

            foreach (var item in items.Join(items2, i => i.Seq, i => i.Seq, (a, b) => new { SeqID = a.Seq, Answer = this.GetTheAnswer(Convert.ToDouble(a.Oil), Convert.ToDouble(b.Oil)) }))
            {                        
                int x = listHead;
                while (x != -1)
                {
                    sw.WriteLine("{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}, {11}, {12}, {13}, {14}, {15}, {16}, {17}, {18}, {19}, {20}, {21}, {22}, {23}, {24}, {25}, {26}, {27}, {28}, {29}, {30}, {31}, {32}, {33}, {34}, {35}, {36}",
            QuoteString(leaseName[x]), fieldName[x], QuoteString2(reservoir[x]), operator1[x], county[x], state[x], majo[x], resvCatgory[x], disRate[x], netOil2Int[x], netGas2Int[x], workingInt[x], grossWells[x]
            , ultOil[x], ultGas[x], grossOil[x], grossNGL[x], grossGas[x], netOil[x], netGas[x], netNGL[x], revToInt[x], operExpense[x], totInvest[x], revOil[x], revGas[x], operatingProfit[x],
            revNGL[x], discNetIncome[x], seqNum[x], wellID[x], incASN[x], lifeYears[x], ownQual[x], prodTax[x], item.SeqID, item.Answer);
            x = pointers[x];

                    //sw.WriteLine(item);
                }
                sw.Close();
            }
        }

明らかに、これをテストすることはできませんでしたが、うまくいけば、これがあなたを正しい道に導き、私はスティックの正しい端を手に入れました!

于 2013-06-06T16:28:13.240 に答える