创建二维数组

时间:2012-08-29 15:46:45

标签: c# asp.net-mvc-3 linq-to-sql multidimensional-array

我正在尝试创建一个二维数组,我感到很困惑。一位同事告诉我,我需要在字典中为数组列表创建一个字典,但他不能坚持帮助我。

我已经能够创建第一个列出像这样的程序的数组

+ 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来循环会计期间,但它不起作用。我想我可能走在正确的轨道上,我希望能够提供一些指导,或者至少是一个教程供我遵循。我已经在下面的第二个数组中发布了我写的代码。我正在使用C#和MVC 3.您可能会注意到它们不是字典中的字典。如果我的同事是正确的,我将如何做这样的事情,我看了一下这个问题using dictionary as a key in other dictionary,但我不明白我将如何在这种情况下使用它。

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;
    } 

我希望我已经清楚地解释了我的问题,请随时要求任何澄清,因为我需要解决这个问题,并且会经常回来查看。谢谢你的帮助!

3 个答案:

答案 0 :(得分:1)

不要尝试使用匿名类型或LINQ投影来创建新的数据类型,特别是如果你是初学者,你会感到困惑。如果需要专门的数据类型,请定义一个; e.g:

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);

这应该足以让你开始。

答案 1 :(得分: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

答案 2 :(得分: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循环之外,所以它只从SQL中提取了1个数据而不是全部12个月。我希望这有助于其他一些试图将数据从SQL数据源提取到多维数组中的人。