1

2 次元配列を作成しようとしていますが、混乱しています。同僚から、配列リストの辞書内に辞書を作成する必要があると言われましたが、彼は私を助けるために固執することができませんでした。

このようなプログラムをリストする最初の配列を作成できました

+ project 1
+ project 2
+ project 3
+ project 4

このタスクを実行するコードは以下のとおりです。

var PGList = from x in db.month_mapping
             where x.PG_SUB_PROGRAM == SP 
             select x;
             //select x.PG.Distinct().ToArray();

var PGRow = PGList.Select(x => new { x.PG }).Distinct().ToArray();

これで垂直方向の配列が処理され、次に水平方向の配列を追加して、各会計期間に費やされた合計金額を確認できるようにする必要があります。したがって、最終的な出力は次のようになりますが、もちろんダッシュはありません。

+ program 1-------100---200---300---400---500---600---700---800---900---1000---1100---1200
+ program 2-------100---200---300---400---500---600---700---800---900---1000---1100---1200
+ program 3-------100---200---300---400---500---600---700---800---900---1000---1100---1200
+ program 4-------100---200---300---400---500---600---700---800---900---1000---1100---1200

foreach を使用して会計期間を循環させようとしましたが、うまくいきません。私は正しい方向に進んでいると思います.SOが何らかのガイダンスを提供するか、少なくとも私が従うべきチュートリアルを提供できることを望んでいました. これまでに書いたコードを下の 2 番目の配列に投稿しました。私は C# と MVC 3 を使用しています。辞書内の辞書ではないことに気付くかもしれません。私の同僚が正しい場合、どうすればそのようなことができるでしょうか。辞書を他の辞書のキーとして使用してこの質問を調べましたが、この状況でどのように使用するのかわかりません。

Dictionary<string, double[]> MonthRow = new Dictionary<string, double[]>();

double[] PGContent = new double[12];

string lastPG = null;

foreach (var item in PGRow)
{
    if (lastPG != item.PG)
    {
        PGContent = new double[12];
    }


    var MonthList = from x in db.Month_Web
                    where x.PG == PG
                    group x by new { x.ACCOUNTING_PERIOD, x.PG, x.Amount } into pggroup
                    select new { accounting_period = pggroup.Key.ACCOUNTING_PERIOD, amount = pggroup.Sum(x => x.Amount) };

    foreach (var P in MonthList)
    {
        int accounting_period = int.Parse(P.accounting_period) - 1;
        PAContent[accounting_period] = (double)P.amount;
        MonthRow[item.PG] = PGContent;
        lastPG = item.PG;
    } 

問題を明確に説明したことを願っています。この問題を解決する必要があり、頻繁に確認する必要があるため、必要な説明があればお気軽にお尋ねください。ご協力いただきありがとうございます!

4

3 に答える 3

1

匿名型または LINQ プロジェクションを使用して新しいデータ型を作成しようとしないでください。特に初心者の場合は、混乱するだけです。特殊なデータ型が必要な場合は、定義してください。例えば:

public class Account
{
    public string Name { get; private set; }
    public decimal[] MonthAmount { get; private set; }

    readonly int maxMonths = 12;

    public Account(string name, ICollection<decimal> monthAmounts)
    {
        if (name == null)
            throw new ArgumentNullException("name");

        if (monthAmounts == null)
            throw new ArgumentNullException("monthAmounts");

        if (monthAmounts.Count > maxMonths)
            throw new ArgumentOutOfRangeException(string.Format(" monthAmounts must be <= {0}", maxMonths));

        this.Name = name;

        this.MonthAmount = new decimal[maxMonths];
        int i = 0;
        foreach (decimal d in monthAmounts)
        {
            this.MonthAmount[i] = d;
            i++;
        }
    }
}

この型のインスタンスを直接使用します。配列、辞書、リストなどに変換する必要はありません。

var accountPeriods = new List<Account>();
accountPeriods.Add(new Account("program-1", new decimal[] { 1, 2, 3, 4 }));

LINQ などを使用して、新しい型のインスタンスをクエリまたは変更できます。

foreach (Account a in accountPeriods)
    foreach (decimal d in a.MonthAmount)
        DoSomethingWith(d);

それはあなたが始めるのに十分なはずです.

于 2012-08-29T16:51:23.610 に答える
1

お役に立てれば。

// sample data
var data = new Dictionary<string, List<int>>();
data.Add("program-1", new List<int>() { 100, 110, 130 });
data.Add("program-2", new List<int>() { 200, 210, 230 });
data.Add("brogram-3", new List<int>() { 300, 310, 330 });

// query data
var newData = (from x in data
               where x.Key.Contains("pro")
               select x).ToDictionary(v => v.Key, v=>v.Value);

// display selected data
foreach (var kv in newData)
{
    Console.Write(kv.Key);
    foreach (var val in kv.Value)
    {
        Console.Write(" ");
        Console.Write(val.ToString());
    }
    Console.WriteLine();
}

出力は次のとおりです。

program-1 100 110 130
program-2 200 210 230
于 2012-08-29T17:45:51.340 に答える
0

@Ray Cheng と @Dour High Arch の助けに感謝したいのですが、このタスクを達成する別の方法を見つけたので、コードを投稿して、同じ問題を抱えている次の人が問題をより迅速に理解できるようにしたいと考えました。 .

上記では、コードをより管理しやすいセクションに分割して、問題をできるだけ明確に説明しています。以下のコードでは、これらすべての部分を組み合わせて、全体像を確認できるようにしています。このコードは、プログラムと毎月の金額を含む配列を返します。

public virtual ActionResult getAjaxPGs(string SP = null)
        {

            if (SP != null)
            {


                var PGList = from x in db.month_mapping
                             where x.PG_SUB_PROGRAM == SP 
                             select x;




                var PGRow = PGList.Select(x => new { x.PG }).Distinct().ToArray();

                float[] PGContent = new float[12];




                Dictionary<string,float[]> MonthRow = new Dictionary<string, float[]>();


                foreach (var item in PGRow)
                {

                        PGContent = new float[12];




                    var MonthList = from x in db.month_Web
                                    where x.PG == item.PG
                                    group x by new { x.ACCOUNTING_PERIOD, x.PG, x.Amount } into pggroup
                                    select new { accounting_period = pggroup.Key.ACCOUNTING_PERIOD, amount = pggroup.Sum(x => x.Amount) };

                    foreach (var mon in MonthList)
                    {
                        int accounting_period = int.Parse(mon.accounting_period) - 1;
                        PGContent[accounting_period] = (float)mon.amount/1000000;
                    }


                    MonthRow[item.PG] = PGContent;

                    }





                return Json(MonthRow, JsonRequestBehavior.AllowGet);

            }


            return View();
        }

コードにデータを直接追加するのではなく、Linq から SQL クエリにプルしているため、このコードはうまく機能しました。私の問題は、主にデータ プルを foreach ループの外に置くことから生じたため、12 か月すべてではなく、SQL から 1 つのデータのみをプルしました。これが、SQL データ ソースから多次元配列にデータを取り込もうとしている他の人に役立つことを願っています。

于 2012-08-31T16:55:46.570 に答える